С++: Проблема с операцией delete
Модератор: Модераторы разделов
-
nickmus-zlob
- Сообщения: 11
- ОС: Linux + Windows XP Pro
С++: Проблема с операцией delete
Здравствуйте.
В данном примере я реализовал универсальный аудио-буфер (на все типы) и функции для базового сервиса.
Для сборки использую компилятор 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, там - никаких претензий.
В данном примере я реализовал универсальный аудио-буфер (на все типы) и функции для базового сервиса.
Для сборки использую компилятор 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
Если память выделяется как new type[number], удалять её надо delete[] pointer;
Правда ошибка вряд ли из за этого. Советую прогнать программу под valgrind-ом, он покажет источник ошибки.
Про язык D знает кто то кроме меня?
Отрадно.
Правда ошибка вряд ли из за этого. Советую прогнать программу под valgrind-ом, он покажет источник ошибки.
Попробовал все это перевести на язык D, там - никаких претензий.
Про язык D знает кто то кроме меня?
-
agbr
- Сообщения: 486
- ОС: openSUSE 10.2
Re: С++: Проблема с операцией delete
а че?
оно уже стандартизировано?
jabber: agbr@jabber.ru
против проприетарного ПО в GNU/Linux
против проприетарного ПО в GNU/Linux
-
v04bvs
- Сообщения: 636
- ОС: Debian GNU/Linux
Re: С++: Проблема с операцией delete
В какой то степени да. http://digitalmars.com/d/lex.html Правда он активно развивается и останавливаться не собирается, но уже сейчас это вполне зрелый язык, с моей точки зрения "делающий" С++, Javу и C#. Во избежание флейма поясню, как язык а не как платформа.
-
Jan2ary
- Бывший модератор
- Сообщения: 630
- Статус: Тщедушный очкарик
Re: С++: Проблема с операцией delete
Делающий джаву как платформа? Ню-ню...
Не шалю, никого не трогаю, починяю примус...
-
v04bvs
- Сообщения: 636
- ОС: Debian GNU/Linux
-
siregha
- Сообщения: 12
Re: С++: Проблема с операцией delete
Дело в том, что для реализации new и delete используются низкоуровневые malloc и free, а ошибка говорит о повторном освобождении памяти.
Приведенный код - это ИМХО не С++, поскольку в С++ существуют такие понятия как конструктор/деструктор класса, виртуальные функции...
Приведенный код - это ИМХО не С++, поскольку в С++ существуют такие понятия как конструктор/деструктор класса, виртуальные функции...
-
eduard_pustobaev
- Сообщения: 2629
- Статус: Ленивец
- ОС: Arch/Debian.
Re: С++: Проблема с операцией delete
Ага, понято с точностью до наоборот.
P.S. Если не лень. Можно написать свои соображения по поводу этого языка? Хотелось бы услышать мнение толкового специалиста.
В дисгармонии со вселенной.
-
v04bvs
- Сообщения: 636
- ОС: Debian GNU/Linux
Re: С++: Проблема с операцией delete
eduard_pustobaev писал(а): ↑22.06.2007 23:39P.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
Ясненько. Александреску я доверяю.
Спасибо за комментарий.
В дисгармонии со вселенной.
-
nickmus-zlob
- Сообщения: 11
- ОС: Linux + Windows XP Pro
Re: С++: Проблема с операцией delete
siregha писал(а): ↑22.06.2007 23:09Дело в том, что для реализации new и delete используются низкоуровневые malloc и free, а ошибка говорит о повторном освобождении памяти.
Приведенный код - это ИМХО не С++, поскольку в С++ существуют такие понятия как конструктор/деструктор класса, виртуальные функции...
Вспомнили, С++ - надстройка над С. Значит это только - интерфейс к glibc, цель которого - избавить программиста от нудных sizeof и #include ...
По идее, правильно сделанная программа не должна в принципе создавать мусора (т.е. указатели должны вовремя очищаться).
А значит, и мусоросборщик никчему.
-
agbr
- Сообщения: 486
- ОС: openSUSE 10.2
Re: С++: Проблема с операцией delete
а впрочем похъ
jabber: agbr@jabber.ru
против проприетарного ПО в GNU/Linux
против проприетарного ПО в GNU/Linux
-
agbr
- Сообщения: 486
- ОС: openSUSE 10.2
Re: С++: Проблема с операцией delete
что значит "отстаёт от стандарта"?
язык, "стандарт" которого вовсе не стандарт, а прихоть автора пригоден исключительно для написания студенческих поделок: ни один нормальный человек не будет вкладывать деньги в создание ПО, которое каждый месяц нужно будет переписывать, чтобы оно собиралось под новым компилятором и поддерживать все тридцать три тысячи версия бурно развивающегося языка.
jabber: agbr@jabber.ru
против проприетарного ПО в GNU/Linux
против проприетарного ПО в GNU/Linux
-
nickmus-zlob
- Сообщения: 11
- ОС: Linux + Windows XP Pro
Re: С++: Проблема с операцией delete
agbr писал(а): ↑23.06.2007 12:23
что значит "отстаёт от стандарта"?
язык, "стандарт" которого вовсе не стандарт, а прихоть автора пригоден исключительно для написания студенческих поделок: ни один нормальный человек не будет вкладывать деньги в создание ПО, которое каждый месяц нужно будет переписывать, чтобы оно собиралось под новым компилятором и поддерживать все тридцать три тысячи версия бурно развивающегося языка.
И незачем переписывать. Вот, например, кому мешает совместимость с классами (С++) ? А в результате - проблемы с подключением всяких framework-ов: Qt, wxWidget, FLTK... И, кстати, про D говорят, что это - единый стандарт на замену сотням расширений С/С++, а не является ли Digital Mars D сам расширенным ?
P.S. - Есть повод создать новую тему для D или поискать существующую.
-
agbr
- Сообщения: 486
- ОС: openSUSE 10.2
Re: С++: Проблема с операцией delete
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
против проприетарного ПО в GNU/Linux
-
agbr
- Сообщения: 486
- ОС: openSUSE 10.2
Re: С++: Проблема с операцией delete
v04bvs писал(а): ↑23.06.2007 00:11Минусы я вижу такие: за D нет богатой корпорации, и нет IDE как у java-ы. Библиотек в принципе уже достаточно много. И ещё одна нехорошая штука - есть 2 компилятора dmd и gdc, dmd пишется создателем языка и является закрытым продуктом (правда бесплатным для любого использования), gdc - открытый фронтенд к gcc, и отстаёт от dmd (и соответственно от стандарта), хотя и не намного.
да, конечно, за D должна стояить богатая корпорация, а не открытые международные стандарты;
и, естественно, должен существовать единственный закрытый, причем обязательно платный, компилятор; а все авторы альтернативых компиляторов должны быть повешены за преступление против человечества.
jabber: agbr@jabber.ru
против проприетарного ПО в GNU/Linux
против проприетарного ПО в GNU/Linux
-
eduard_pustobaev
- Сообщения: 2629
- Статус: Ленивец
- ОС: Arch/Debian.
Re: С++: Проблема с операцией delete
Нафлеймили негодяи!
Я для себя попросил личное мнение человека. О чём спорите?
Я для себя попросил личное мнение человека. О чём спорите?
В дисгармонии со вселенной.
-
v04bvs
- Сообщения: 636
- ОС: Debian GNU/Linux
Re: С++: Проблема с операцией delete
agbr писал(а): ↑23.06.2007 12:23что значит "отстаёт от стандарта"?
язык, "стандарт" которого вовсе не стандарт, а прихоть автора пригоден исключительно для написания студенческих поделок: ни один нормальный человек не будет вкладывать деньги в создание ПО, которое каждый месяц нужно будет переписывать, чтобы оно собиралось под новым компилятором и поддерживать все тридцать три тысячи версия бурно развивающегося языка.
Все языки в начале своего существования переживают этот период. Сейчас заморожен D 1.0 в котором изменений не будет, будут только багфиксы, если нужна стабильность.
На D есть стандарт, и есть компилятор, его реализующий.
если одним прекрасным утром авторы решат, что некая синтаксическая конструкция вообще не нужна или должна работать перпендикулярным образом (или кто-то решит скомпилировать каким-то одним из 10 несовместимых друг с другом компиляторов), это будут МОИ проблемы, причем возможно финансовые
А если метеорит упадёт?
поэтому в качестве академического исследования D может быть как угодно хорош, но его промышленное использование пока он не стандартизирован невозможно.
Возможно. Трудности будут, я думаю не очень большие. У любого решения есть плюсы и минусы.
или все забыли светлые времена нестандартизированного C++, и множественных поделий типа Borland C++/Microsoft C++?
Ага, вот только в те времена каким то образом, на нестардартизованном С++ ухитрялись писать огромное количество кода. Который даже работал. И приносил доход.
Эти вещи не зависимы друг от друга.
Богатая корпорация может написать фреймворки, IDE, продвигать его на рынке, и тд и тп.
Например .NET - не самая лучшая технология, не понятно, чем она намного лучше java, а свой кусок рынка уже оторвала.
и, естественно, должен существовать единственный закрытый, причем обязательно платный, компилятор; а все авторы альтернативых компиляторов должны быть повешены за преступление против человечества.
Ничего не понял. Это каким то образом следует из моего сообщения?
-
agbr
- Сообщения: 486
- ОС: openSUSE 10.2
Re: С++: Проблема с операцией delete
Я не спорю, что все языки переживают подобный период, это неизбежно, в конце концов. А 17 числа не выходил раве 2.000 ?
Так называемый стандарт есть, но он принят не в рамках организаций: ISO, ANSI, IEEE, ECMA, etc... Что вздумается автору такого "стандарта" неизвестно. И реализует ли компилятор стандарт, а не свое альтернативное мнение имени...?
Значит автор повернут на зарабатывании денег, надо так понимать?
ну так может быть дадите всем желающим пропбовать D финансовые гарантии?
вот именно по этой причине C# и Java отправляются в топку, а авторы их использующие туда же, причем даже без обсуждений.
ну если присутсвие разных компиляторов - зло. значит с ним нужно бороться
jabber: agbr@jabber.ru
против проприетарного ПО в GNU/Linux
против проприетарного ПО в GNU/Linux
-
v04bvs
- Сообщения: 636
- ОС: Debian GNU/Linux
Re: С++: Проблема с операцией delete
это альфа-релиз. Стабильная ветка 1.
Так называемый стандарт есть, но он принят не в рамках организаций: ISO, ANSI, IEEE, ECMA, etc...
Если язык будет успешен, его стандарт будет принят подобной организацией. Для меня лично важно наличие стандарта и соответствие ему компиляторов.
И реализует ли компилятор стандарт, а не свое альтернативное мнение имени...?
Если компилятор не соответствует стандарту, это баг.
Значит автор повернут на зарабатывании денег, надо так понимать?
Понятия не имею, на чём он повернут.
ну так может быть дадите всем желающим пропбовать D финансовые гарантии?
Не дам.
вот именно по этой причине C# и Java отправляются в топку, а авторы их использующие туда же, причем даже без обсуждений.
Отправляются в топку в вашей голове. Во всём мире они в топку отправляться не спешат. Как и разработчики, использующие их.
Присутствие разных компиляторов это не зло.
Высказывание
следует понимать том смысле, что у обоих компиляторов есть недостатки (перечисляемые далее), а не в том, что много компиляторов - зло.И ещё одна нехорошая штука - есть 2 компилятора dmd и gdc,