Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > delete и delete [] для массивов встроенных типов


Автор: Kuvaldis 20.3.2008, 19:52
Всем привет!
Возникла такая проблема:
Код

#include "stdafx.h"
#include <crtdbg.h>

_CrtMemState  cm1, cm2, cm;

int _tmain(int argc, _TCHAR* argv[])
{
    _CrtMemCheckpoint( &cm1 );
    int * v1 = new int[10];
    delete /* []  */  v1;     
    _CrtMemCheckpoint( &cm2 );
    int delta = cm2.lSizes[1] - cm1.lSizes[1];

    return 0;
}

И в случае применения [] и без скобок код корректно (вроде бы) освобождает память. Конечно, при работе с массивом объектов это уже не так, но для встроенных типов поведение для меня странное.
Кто что может сказать по этому поводу?
Смотрел дизассемблированный код в vs2005. Он идентичен для обоих вариантов.  



Автор: Rififi 20.3.2008, 20:03
Цитата
Кто что может сказать по этому поводу?

Микрософт делает поблажки нерадивым программистам? :green:

Автор: maxim1000 20.3.2008, 20:43
если стандарт требует гарантии, что две конструкции работают одинаково, это не означает, что он требует, чтобы они работали по-разному smile

Добавлено через 39 секунд
Цитата(Rififi @  20.3.2008,  20:03 Найти цитируемый пост)
Микрософт делает поблажки нерадивым программистам?

может, просто так было удобнее реализовать, стандарту не противоречит

Автор: vinter 20.3.2008, 21:17
может работать так, а может и не так. Не определено что произойдет в случае применения одиночного делита для массива, может удалит все, а может нет.

Автор: korian 21.3.2008, 02:50
в общем случае это не определено, а на практике при одиночном делите массива (без скобок), деструктор вызывается только для одного объекта массива.

Автор: Mayk 21.3.2008, 06:27
Цитата(korian @  21.3.2008,  06:50 Найти цитируемый пост)
в общем случае это не определено, а на практике при одиночном делите массива (без скобок), деструктор вызывается только для одного объекта массива.

не всегда. у меня segfault происходил либо во время либо немного после неверного delete'а.

Автор: baldina 21.3.2008, 10:34
Цитата

дизассемблированный код в vs2005. Он идентичен для обоих вариантов

Это потому что деструктор для встроенных типов - пустая функция, как и деструктор по умолчанию. Напиши класс без деструктора, будет то же самое. Дизассемблированный код просто не содержит этих ненужных вызовов (да и функций-деструкторов как таковых нет для встроенных типов).

Добавлено через 2 минуты и 52 секунды
память, выделенная operator new() должна освобождаться при помощи operator delete()
память, выделенная operator new[]() должна освобождаться при помощи operator delete[]()

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)