Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> delete и delete [] для массивов встроенных типов 
:(
    Опции темы
Kuvaldis
Дата 20.3.2008, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

Репутация: 11
Всего: 61



Всем привет!
Возникла такая проблема:
Код

#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. Он идентичен для обоих вариантов.  





--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
Rififi
Дата 20.3.2008, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 11
Всего: 36



Цитата
Кто что может сказать по этому поводу?

Микрософт делает поблажки нерадивым программистам? :green:
PM MAIL   Вверх
maxim1000
Дата 20.3.2008, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



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

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

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


--------------------
qqq
PM WWW   Вверх
vinter
Дата 20.3.2008, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



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


--------------------
Мой блог
PM MAIL WWW   Вверх
korian
Дата 21.3.2008, 02:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 3
Всего: 17



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

Это сообщение отредактировал(а) korian - 21.3.2008, 05:01
PM   Вверх
Mayk
Дата 21.3.2008, 06:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



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

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


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
baldina
Дата 21.3.2008, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



Цитата

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

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

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

привыкни так делать для всех типов, проблем будет меньше. не гарантируется что хотя бы для встроенных типов их смешивание будет работать.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0816 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.