279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
1

Как правильно освободить память

28.07.2016, 08:16. Показов 1501. Ответов 3
Метки нет (Все метки)

Здравствуйте все! Подскажите, как правильно освобождать память, выделенную под массив оператором new?
C++
1
2
3
4
5
int *Arr = new int[10];
...
delete Arr;    // Правильно так?
delete [] Arr; // Или так правильно?
// А может без разницы???
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.07.2016, 08:16
Ответы с готовыми решениями:

Как правильно освободить память
Есть функция char* md5(const char*). Как освободить память выделенную ею? #include <openssl\md5.h>...

Как правильно освободить память
Написал вот такой костыль: wchar_t* getDate() { time_t seconds = time(NULL); tm timeinfo =...

Как правильно освободить память
Здрасте! (Тема: Шаблоны функций.) Не могу правильно написать метод для освобождения памяти. В...

Как правильно освободить память деструктором?
Не могу понять, как освободить память деструктором... В общем, я объявляю в private динамический...

3
16255 / 8819 / 2159
Регистрация: 30.01.2014
Сообщений: 15,230
28.07.2016, 08:26 2
Правильно так:
Цитата Сообщение от d7d1cd Посмотреть сообщение
C++
1
delete [] Arr;
0
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
28.07.2016, 09:04  [ТС] 3
Что будет, если удаление сделать без квадратных скобок []? Удалится только первый элемент массива?
0
16255 / 8819 / 2159
Регистрация: 30.01.2014
Сообщений: 15,230
28.07.2016, 09:33 4
Лучший ответ Сообщение было отмечено d7d1cd как решение

Решение

d7d1cd, зависит от стечения обстоятельств (реализации компилятора и стандартной библиотеки, режима компиляции) и типа элементов. Может быть как все нормально, так и, например, аварийное завершение программы. Поведение не определено.

Добавлено через 19 минут
d7d1cd, вот, например, демонстрация аварийного завершения программы, собранной в clang:

http://rextester.com/STBI88613

В данном случае происходит так потому, что реализация new закладывается на определенные соглашения. В частности, размер блока памяти от менеджера памяти, выделяется чуть больше, с таким запасом, чтобы хватило для дополнительного размещения значения типа size_t. Это значение используется для хранения количества элементов. Размещается оно в начале выделенной области памяти, а пользователю (то есть программисту) возвращается смещенный на sizeof(size_t) указатель, который указывает на собственно данные. delete[] знает об этом, и выполнит обратное действие: сместится назад на sizeof(size_t) получит количество элементов, обеспечит вызов соответствующего числа деструкторов, а затем отдаст указатель на выделенный блок памяти менеджеру памяти для освобождения. Если же использовать delete, то ничего этого не произодет. Будет попытка вызова одного деструктора, а затем указатель будет передан менеджеру памяти для освобождения. Но т.к. это неверный указатель (менеджер памяти не возвращал нам его: указатель был искусственно получен путем смещения на sizeof(size_t)) то корректно освободить память он не сможет, что в данном случае приводит к аварийному завершению программы.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.07.2016, 09:33
Помогаю со студенческими работами здесь

Динамическая матрица. Как правильно освободить память?
int ROWS = NULL; // Объявление переменных для строк и столбцов. int COLS = NULL; cin >> ROWS...

Подскажите пожалуйста, как правильно освободить память
Всем ку! Подскажите пожалуйста, как правильно удалить(освободить память) массива array2D. ...

Как правильно освободить память после работы с динамическим массивом
Здравствуйте! Помогите понять в чём проблема при освобождении памяти. Простой пример: #define...

Как освободить память?
подскажите как правильно освободить память,спасибо заранее))) #include "stdafx.h" #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru