LINUX.ORG.RU

delete & *** glibc detected *** free(): invalid pointer: 0xbfe732ac ***


0

0

Есть такой кусок кода: Calculator calc(m_points, m_err); ...манипуляции с calc......................... delete &calc; вылетает с ошибкой: *** glibc detected *** free(): invalid pointer: 0xbfe732ac *** Если убрать delete &calc, то нормально работает, объект сам удаляется при выходе из функции. Просто он мне дальше не нужен, хочу удалить чтоб память не занимал.

anonymous

delete уничтожает объект, созданный оператором new, если не вдаваться в подробности. Если ты под свой calc не запрашивал память в хипе, то и уничтожать его дилитом не надо.

Uncle_Theodore ★★
()

Calculator *calc = new Calculator(m_points, m_err);
.....
delete calc;

нельзя использовать delete без new ;)

W0wik
()

Ну так заключи его в фигурные {} скобки, он и удалится, когда ты из них выйдешь. Т.е. вот так:

blahblah();
{
Burbulator b(a,g);
b.something();
}
blah();

gaa ★★
()
Ответ на: комментарий от gaa

>Т.е. вот так:

Насколько я помню Си, функцию создавать не надо. Т.е. просто:

...
{
    Burbulator b(a,g); 
    b.something();
}
...

и всё.

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

> blahblah();
> {
> Burbulator b(a,g);
> b.something();
> }
> blah();

Насколько я помню Си, функцию создавать не надо. Т.е. просто:

...
{
Burbulator b(a,g);
b.something();
}
...

а сейчас предлагаю прочитать повнимательнее и увидеть, что же именно я написал :)

gaa ★★
()

Спасибо за ответы.

anonymous
()
Ответ на: комментарий от gaa

> а сейчас предлагаю прочитать повнимательнее и увидеть, что же именно я написал :)

поддерживаю. Я лично сразу понял, даже несмотря на обычные проблемы с форматированием:)

dilmah ★★★★★
()
Ответ на: комментарий от gaa

>а сейчас предлагаю прочитать повнимательнее и увидеть, что же именно я написал :)

Гы. Я это по диагонали прочитал как написание вложенной функции и её последующий вызов :D

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

> Я это по диагонали прочитал как написание вложенной функции и её последующий вызов :D

Насколько я помню C, там вложенных функций нет. Или уже есть?

gaa ★★
()
Ответ на: комментарий от gaa

> Насколько я помню C, там вложенных функций нет. Или уже есть?

В стандарте нету. Как GNUтое расширение -- есть...

Uncle_Theodore ★★
()
Ответ на: комментарий от gaa

>Насколько я помню C, там вложенных функций нет. Или уже есть?

Х.З., я на нём уже скоро 12 лет, как ничего не писал. За это время многое изменилось :)

KRoN73 ★★★★★
()
Ответ на: комментарий от gaa

Тоже давно не практиковался... но кажется сильно зависит от реализации - будет объект удаляться по выходу из блока, или только по выходу из самой функции. В теории компиляторы могут генерировать разный код (хотя здесь подразумевается гнутый). Плз поправьте, если не так.

dave ★★★★★
()
Ответ на: комментарий от dave

есть стандарт
если компилятор его не поддерживает - грош ему цена

rei3er
()
Ответ на: комментарий от dave

Деструктор должен вызваться по выходу из блока. И этим активно пользуются где-то так:

mutex m; { locker<mutex> lock(&m); blah, blah, blah; }

rymis ★★
()
Ответ на: комментарий от rymis

В одной из книг Страуструпа было написано, что стандарт этого не гарантирует (или "не гарантировал" - точную формулировку уже не помню). Как пример приводился G++, где это действительно работает таким способом (вызов деструктора по выходу из блока). Но другие компиляторы могли создавать другой код. Вот, мне и интересно, стандартизировано это сейчас, или как раньше остается vendor-specific?

Грубо говоря, будет дружить этот код с последним сановским компилятором?

dave ★★★★★
()
Ответ на: комментарий от dave

> Вот, мне и интересно, стандартизировано это сейчас, или как раньше остается vendor-specific?

98 год:

Destructors are invoked implicitly _____snipped_____ (2) for a constructed object with automatic storage duration when the block in which the object is created exits.

dilmah ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.