С++: Проблема с операцией delete

Модератор: Модераторы разделов

nickmus-zlob
Сообщения: 11
ОС: Linux + Windows XP Pro

С++: Проблема с операцией delete

Сообщение nickmus-zlob »

Здравствуйте.

В данном примере я реализовал универсальный аудио-буфер (на все типы) и функции для базового сервиса.
Для сборки использую компилятор GNU C++ 4.1.2

Вот текст:
/************************************* SoundBuffer.h *******************/
enum BufferType {
VOID = 0,
INT8,
UINT8,
.......
};

struct SoundBuffer {
BufferType type;
union {
void * data_void;
int8_t * data_int8;
uint8_t *
//..... // Типы uint.._t и int.._t - это псевдонимы стандартных типов из файла stdint.h
// В моем случае этот файл проверяется при компиляции автоматически (без #include...)
};

uint32_t size;

void init(); // Задача этой функции инициализировать указатели на функции стиповой зависимостью
void (*clearBuffer)(SoundBuffer *); // Пример такого указателя
};

/************************************* ClearBuffer.cxx ************/

void clearBuffer_int8 {
delete data_int8;
}

void clearBuffer_uint8 {
delete data_uint8;
}
//........ и т.д.

void SoundBuffer::init() {
switch
}

/************************************** initBuffer.cxx **********/

#include "SoundBuffer.h"

void SoundBuffer::init() {
switch(type) {

case(INT8) : {
clearBuffer = clearBuffer_int8;
data_int8 = new int8_t[size];
break;}

case(UINT8): {
clearBuffer = clearBuffer_uint8;
data_uint8 = new uint8_t[size];
break;}

//.......

};
}


/*********************************** test.cxx ********************/

#include <iostream.h>
#include "SoundBuffer.h"

int main() {
cout << "Создание буфера... ";
SoundBuffer buffer;
buffer.type = INT8, buffer.size = 128;
buffer.init()

/* Дальше должны быть тестовые процедуры,
* связанные с работой над аудиоданными массива data_<int/float/..> [size].
пока что здесь пусто. */

if(buffer.data_void) {
cout << "Удаление буфера... ";
buffer.clear(); cout << "OK\n";
}
}

/******************************** Конец *************************/
Компилируем, собираем, запускаем...

****************************************************
./test

Создание буфера... OK
Очистка буфера... OK
*** glibc detected *** ./test: double free or corruption (top): 0x09350008 ***
======= Backtrace: =========
/lib/libc.so.6[0x9c2fb0]
/lib/libc.so.6(__libc_free+0x77)[0x9c34eb]
/usr/lib/libstdc++.so.6(_ZdlPv+0x23)[0xdaf767]
/usr/lib/libstdc++.so.6(_ZdaPv+0x1b)[0xdaf7b7]
./test(__gxx_personality_v0+0x35f)[0x8048c13]
./test(__gxx_personality_v0+0x2d0)[0x8048b84]
./test(__gxx_personality_v0+0x2f1)[0x8048ba5]
./test(__gxx_personality_v0+0x27e)[0x8048b32]
/lib/libc.so.6(__libc_start_main+0xdf)[0x974d6f]
./test(__gxx_personality_v0+0x61)[0x8048915]
======= Memory map: ========
**********************************************************
Причем здесь glibc, когда работают new и delete ?

Попробовал все это перевести на язык D, там - никаких претензий.
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: С++: Проблема с операцией delete

Сообщение v04bvs »

Если память выделяется как new type[number], удалять её надо delete[] pointer;
Правда ошибка вряд ли из за этого. Советую прогнать программу под valgrind-ом, он покажет источник ошибки.

Попробовал все это перевести на язык D, там - никаких претензий.

Про язык D знает кто то кроме меня? :) Отрадно.
Спасибо сказали:
Аватара пользователя
agbr
Сообщения: 486
ОС: openSUSE 10.2

Re: С++: Проблема с операцией delete

Сообщение agbr »

v04bvs писал(а):
22.06.2007 20:21
Попробовал все это перевести на язык D, там - никаких претензий.

Про язык D знает кто то кроме меня? :) Отрадно.


а че?
оно уже стандартизировано?
jabber: agbr@jabber.ru

против проприетарного ПО в GNU/Linux
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: С++: Проблема с операцией delete

Сообщение v04bvs »

agbr писал(а):
22.06.2007 20:24
v04bvs писал(а):
22.06.2007 20:21
Попробовал все это перевести на язык D, там - никаких претензий.

Про язык D знает кто то кроме меня? :) Отрадно.


а че?
оно уже стандартизировано?

В какой то степени да. http://digitalmars.com/d/lex.html Правда он активно развивается и останавливаться не собирается, но уже сейчас это вполне зрелый язык, с моей точки зрения "делающий" С++, Javу и C#. Во избежание флейма поясню, как язык а не как платформа.
Спасибо сказали:
Аватара пользователя
Jan2ary
Бывший модератор
Сообщения: 630
Статус: Тщедушный очкарик

Re: С++: Проблема с операцией delete

Сообщение Jan2ary »

Делающий джаву как платформа? Ню-ню...
Не шалю, никого не трогаю, починяю примус...
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: С++: Проблема с операцией delete

Сообщение v04bvs »

Jan2ary писал(а):
22.06.2007 22:28
Делающий джаву как платформа? Ню-ню...

Я старался выразить свою мысль. Наверное у меня не получилось :(
Спасибо сказали:
siregha
Сообщения: 12

Re: С++: Проблема с операцией delete

Сообщение siregha »

Дело в том, что для реализации new и delete используются низкоуровневые malloc и free, а ошибка говорит о повторном освобождении памяти.
Приведенный код - это ИМХО не С++, поскольку в С++ существуют такие понятия как конструктор/деструктор класса, виртуальные функции...
Спасибо сказали:
Аватара пользователя
eduard_pustobaev
Сообщения: 2629
Статус: Ленивец
ОС: Arch/Debian.

Re: С++: Проблема с операцией delete

Сообщение eduard_pustobaev »

v04bvs писал(а):
22.06.2007 22:59
Jan2ary писал(а):
22.06.2007 22:28
Делающий джаву как платформа? Ню-ню...

Я старался выразить свою мысль. Наверное у меня не получилось :(

Ага, понято с точностью до наоборот.

P.S. Если не лень. Можно написать свои соображения по поводу этого языка? Хотелось бы услышать мнение толкового специалиста.
В дисгармонии со вселенной.
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: С++: Проблема с операцией delete

Сообщение v04bvs »

eduard_pustobaev писал(а):
22.06.2007 23:39
P.S. Если не лень. Можно написать свои соображения по поводу этого языка? Хотелось бы услышать мнение толкового специалиста.

Насчёт толкового специалиста это не ко мне :)
Для меня D = С++ со сборщиком мусора и классным метапрограммированием (многие вещи которые в С++ делаются через груду костылей, в D реализуются просто и логично). Помесь С++ и Java, причём лучших сторон. Написал на нём курсовую - интерпретатор схемы, писать одно удовольствие.

Кстати один из тестов, который показывает, как в него можно интегрировать другие языки.

Код: Выделить всё

import scheme.common;

void main()
{
    mixin(parse(r"
(define fact (lambda (n) (if (> n 0) (* n (fact (- n 1))) 1)))
"));
    assert(fact(5).toInt() == 120);
}

Это корректный исходник на D :) Кто знает схему, должны оценить.

Минусы я вижу такие: за D нет богатой корпорации, и нет IDE как у java-ы. Библиотек в принципе уже достаточно много. И ещё одна нехорошая штука - есть 2 компилятора dmd и gdc, dmd пишется создателем языка и является закрытым продуктом (правда бесплатным для любого использования), gdc - открытый фронтенд к gcc, и отстаёт от dmd (и соответственно от стандарта), хотя и не намного.

PS Кстати интересный факт, в развитии языка довольно активное участие принимает Александреску :)
Спасибо сказали:
Аватара пользователя
eduard_pustobaev
Сообщения: 2629
Статус: Ленивец
ОС: Arch/Debian.

Re: С++: Проблема с операцией delete

Сообщение eduard_pustobaev »

v04bvs писал(а):
23.06.2007 00:11
PS Кстати интересный факт, в развитии языка довольно активное участие принимает Александреску :)

Ясненько. Александреску я доверяю. :)

Спасибо за комментарий.
В дисгармонии со вселенной.
Спасибо сказали:
nickmus-zlob
Сообщения: 11
ОС: Linux + Windows XP Pro

Re: С++: Проблема с операцией delete

Сообщение nickmus-zlob »

siregha писал(а):
22.06.2007 23:09
Дело в том, что для реализации new и delete используются низкоуровневые malloc и free, а ошибка говорит о повторном освобождении памяти.
Приведенный код - это ИМХО не С++, поскольку в С++ существуют такие понятия как конструктор/деструктор класса, виртуальные функции...


Вспомнили, С++ - надстройка над С. Значит это только - интерфейс к glibc, цель которого - избавить программиста от нудных sizeof и #include ...
По идее, правильно сделанная программа не должна в принципе создавать мусора (т.е. указатели должны вовремя очищаться).
А значит, и мусоросборщик никчему.
Спасибо сказали:
Аватара пользователя
agbr
Сообщения: 486
ОС: openSUSE 10.2

Re: С++: Проблема с операцией delete

Сообщение agbr »

а впрочем похъ
jabber: agbr@jabber.ru

против проприетарного ПО в GNU/Linux
Спасибо сказали:
Аватара пользователя
agbr
Сообщения: 486
ОС: openSUSE 10.2

Re: С++: Проблема с операцией delete

Сообщение agbr »

v04bvs писал(а):
23.06.2007 00:11
отстаёт от dmd (и соответственно от стандарта),


что значит "отстаёт от стандарта"?
язык, "стандарт" которого вовсе не стандарт, а прихоть автора пригоден исключительно для написания студенческих поделок: ни один нормальный человек не будет вкладывать деньги в создание ПО, которое каждый месяц нужно будет переписывать, чтобы оно собиралось под новым компилятором и поддерживать все тридцать три тысячи версия бурно развивающегося языка.
jabber: agbr@jabber.ru

против проприетарного ПО в GNU/Linux
Спасибо сказали:
nickmus-zlob
Сообщения: 11
ОС: Linux + Windows XP Pro

Re: С++: Проблема с операцией delete

Сообщение nickmus-zlob »

agbr писал(а):
23.06.2007 12:23
v04bvs писал(а):
23.06.2007 00:11
отстаёт от dmd (и соответственно от стандарта),


что значит "отстаёт от стандарта"?
язык, "стандарт" которого вовсе не стандарт, а прихоть автора пригоден исключительно для написания студенческих поделок: ни один нормальный человек не будет вкладывать деньги в создание ПО, которое каждый месяц нужно будет переписывать, чтобы оно собиралось под новым компилятором и поддерживать все тридцать три тысячи версия бурно развивающегося языка.

И незачем переписывать. Вот, например, кому мешает совместимость с классами (С++) ? А в результате - проблемы с подключением всяких framework-ов: Qt, wxWidget, FLTK... И, кстати, про D говорят, что это - единый стандарт на замену сотням расширений С/С++, а не является ли Digital Mars D сам расширенным ?
P.S. - Есть повод создать новую тему для D или поискать существующую.
Спасибо сказали:
Аватара пользователя
agbr
Сообщения: 486
ОС: openSUSE 10.2

Re: С++: Проблема с операцией delete

Сообщение agbr »

nickmus-zlob писал(а):
23.06.2007 14:11
И незачем переписывать. Вот, например, кому мешает совместимость с классами (С++) ? А в результате - проблемы с подключением всяких framework-ов: Qt, wxWidget, FLTK... И, кстати, про D говорят, что это - единый стандарт на замену сотням расширений С/С++, а не является ли Digital Mars D сам расширенным ?
P.S. - Есть повод создать новую тему для D или поискать существующую.


имея ISO/ANSI стандарт на C++ я могу прийти куда угодно и постучать тампком по столу;
не имея стандарта на D, кроме проприетарного компилятора некоего разработчика; если одним прекрасным утром авторы решат, что некая синтаксическая конструкция вообще не нужна или должна работать перпендикулярным образом (или кто-то решит скомпилировать каким-то одним из 10 несовместимых друг с другом компиляторов), это будут МОИ проблемы, причем возможно финансовые

поэтому в качестве академического исследования D может быть как угодно хорош, но его промышленное использование пока он не стандартизирован невозможно.

или все забыли светлые времена нестандартизированного C++, и множественных поделий типа Borland C++/Microsoft C++?
jabber: agbr@jabber.ru

против проприетарного ПО в GNU/Linux
Спасибо сказали:
Аватара пользователя
agbr
Сообщения: 486
ОС: openSUSE 10.2

Re: С++: Проблема с операцией delete

Сообщение agbr »

v04bvs писал(а):
23.06.2007 00:11
Минусы я вижу такие: за D нет богатой корпорации, и нет IDE как у java-ы. Библиотек в принципе уже достаточно много. И ещё одна нехорошая штука - есть 2 компилятора dmd и gdc, dmd пишется создателем языка и является закрытым продуктом (правда бесплатным для любого использования), gdc - открытый фронтенд к gcc, и отстаёт от dmd (и соответственно от стандарта), хотя и не намного.


да, конечно, за D должна стояить богатая корпорация, а не открытые международные стандарты;
и, естественно, должен существовать единственный закрытый, причем обязательно платный, компилятор; а все авторы альтернативых компиляторов должны быть повешены за преступление против человечества.
jabber: agbr@jabber.ru

против проприетарного ПО в GNU/Linux
Спасибо сказали:
Аватара пользователя
eduard_pustobaev
Сообщения: 2629
Статус: Ленивец
ОС: Arch/Debian.

Re: С++: Проблема с операцией delete

Сообщение eduard_pustobaev »

Нафлеймили негодяи!
Я для себя попросил личное мнение человека. О чём спорите?
В дисгармонии со вселенной.
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: С++: Проблема с операцией delete

Сообщение v04bvs »

agbr писал(а):
23.06.2007 12:23
что значит "отстаёт от стандарта"?
язык, "стандарт" которого вовсе не стандарт, а прихоть автора пригоден исключительно для написания студенческих поделок: ни один нормальный человек не будет вкладывать деньги в создание ПО, которое каждый месяц нужно будет переписывать, чтобы оно собиралось под новым компилятором и поддерживать все тридцать три тысячи версия бурно развивающегося языка.

Все языки в начале своего существования переживают этот период. Сейчас заморожен D 1.0 в котором изменений не будет, будут только багфиксы, если нужна стабильность.

agbr писал(а):
23.06.2007 15:11
имея ISO/ANSI стандарт на C++ я могу прийти куда угодно и постучать тампком по столу;
не имея стандарта на D, кроме проприетарного компилятора некоего разработчика;

На D есть стандарт, и есть компилятор, его реализующий.

если одним прекрасным утром авторы решат, что некая синтаксическая конструкция вообще не нужна или должна работать перпендикулярным образом (или кто-то решит скомпилировать каким-то одним из 10 несовместимых друг с другом компиляторов), это будут МОИ проблемы, причем возможно финансовые

А если метеорит упадёт? :) Автор D отличается адекватностью, и особенно не повернут на академичности.

поэтому в качестве академического исследования D может быть как угодно хорош, но его промышленное использование пока он не стандартизирован невозможно.

Возможно. Трудности будут, я думаю не очень большие. У любого решения есть плюсы и минусы.

или все забыли светлые времена нестандартизированного C++, и множественных поделий типа Borland C++/Microsoft C++?

Ага, вот только в те времена каким то образом, на нестардартизованном С++ ухитрялись писать огромное количество кода. Который даже работал. И приносил доход.


agbr писал(а):
23.06.2007 15:27
да, конечно, за D должна стояить богатая корпорация, а не открытые международные стандарты;

Эти вещи не зависимы друг от друга.
Богатая корпорация может написать фреймворки, IDE, продвигать его на рынке, и тд и тп.
Например .NET - не самая лучшая технология, не понятно, чем она намного лучше java, а свой кусок рынка уже оторвала.

и, естественно, должен существовать единственный закрытый, причем обязательно платный, компилятор; а все авторы альтернативых компиляторов должны быть повешены за преступление против человечества.

Ничего не понял. Это каким то образом следует из моего сообщения?
Спасибо сказали:
Аватара пользователя
agbr
Сообщения: 486
ОС: openSUSE 10.2

Re: С++: Проблема с операцией delete

Сообщение agbr »

v04bvs писал(а):
23.06.2007 22:12
Все языки в начале своего существования переживают этот период. Сейчас заморожен D 1.0 в котором изменений не будет, будут только багфиксы, если нужна стабильность.


Я не спорю, что все языки переживают подобный период, это неизбежно, в конце концов. А 17 числа не выходил раве 2.000 ?

v04bvs писал(а):
23.06.2007 22:12
На D есть стандарт, и есть компилятор, его реализующий.


Так называемый стандарт есть, но он принят не в рамках организаций: ISO, ANSI, IEEE, ECMA, etc... Что вздумается автору такого "стандарта" неизвестно. И реализует ли компилятор стандарт, а не свое альтернативное мнение имени...?

v04bvs писал(а):
23.06.2007 22:12
А если метеорит упадёт? :) Автор D отличается адекватностью, и особенно не повернут на академичности.

Значит автор повернут на зарабатывании денег, надо так понимать?

v04bvs писал(а):
23.06.2007 22:12
Возможно. Трудности будут, я думаю не очень большие. У любого решения есть плюсы и минусы.

ну так может быть дадите всем желающим пропбовать D финансовые гарантии?

v04bvs писал(а):
23.06.2007 22:12
Эти вещи не зависимы друг от друга.
Богатая корпорация может написать фреймворки, IDE, продвигать его на рынке, и тд и тп.
Например .NET - не самая лучшая технология, не понятно, чем она намного лучше java, а свой кусок рынка уже оторвала.

вот именно по этой причине C# и Java отправляются в топку, а авторы их использующие туда же, причем даже без обсуждений.

v04bvs писал(а):
23.06.2007 22:12
Ничего не понял. Это каким то образом следует из моего сообщения?

ну если присутсвие разных компиляторов - зло. значит с ним нужно бороться
jabber: agbr@jabber.ru

против проприетарного ПО в GNU/Linux
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: С++: Проблема с операцией delete

Сообщение v04bvs »

agbr писал(а):
24.06.2007 16:23
Я не спорю, что все языки переживают подобный период, это неизбежно, в конце концов. А 17 числа не выходил раве 2.000 ?

это альфа-релиз. Стабильная ветка 1.

Так называемый стандарт есть, но он принят не в рамках организаций: ISO, ANSI, IEEE, ECMA, etc...

Если язык будет успешен, его стандарт будет принят подобной организацией. Для меня лично важно наличие стандарта и соответствие ему компиляторов.

И реализует ли компилятор стандарт, а не свое альтернативное мнение имени...?

Если компилятор не соответствует стандарту, это баг.

Значит автор повернут на зарабатывании денег, надо так понимать?

Понятия не имею, на чём он повернут.

ну так может быть дадите всем желающим пропбовать D финансовые гарантии?

Не дам.

v04bvs писал(а):
23.06.2007 22:12
Эти вещи не зависимы друг от друга.
Богатая корпорация может написать фреймворки, IDE, продвигать его на рынке, и тд и тп.
Например .NET - не самая лучшая технология, не понятно, чем она намного лучше java, а свой кусок рынка уже оторвала.

вот именно по этой причине C# и Java отправляются в топку, а авторы их использующие туда же, причем даже без обсуждений.

Отправляются в топку в вашей голове. Во всём мире они в топку отправляться не спешат. Как и разработчики, использующие их.

v04bvs писал(а):
23.06.2007 22:12
Ничего не понял. Это каким то образом следует из моего сообщения?

ну если присутсвие разных компиляторов - зло. значит с ним нужно бороться

Присутствие разных компиляторов это не зло.
Высказывание
И ещё одна нехорошая штука - есть 2 компилятора dmd и gdc,
следует понимать том смысле, что у обоих компиляторов есть недостатки (перечисляемые далее), а не в том, что много компиляторов - зло.
Спасибо сказали: