Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
RobbyZero
Сообщений: n/a
#1

new[] - delete[] - C++

27.07.2013, 09:27. Просмотров 698. Ответов 8
Метки нет (Все метки)

Всем привет. Глупый вопрос, но тем не менее, он меня крайне заинтересовал.
Вот например, есть такой код:
C++
1
2
3
4
5
void main()
{
      int *arr = new int[10];
      delete[] arr;
}
Данный код не несет никаких утечек памяти, т.к. память выделенная в размере 40 байт память освобождается оператором delete[]. Вопрос следующий: каким образом оператор delete[] узнал сколько элементов содержит мой массив (сколько байт), чтобы полностью освободить необходимую память?
Мои предположение таково: операторы new-delete, где то у себя сохраняют эту информацию. Либо ОС?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.07.2013, 09:27     new[] - delete[]
Посмотрите здесь:

new и delete - C++
Ошибка, незнаю как для моего класса выделить память. Как исправить? class MyClass { int a, b, c; public: MyClass(int a,...

New delete - C++
написал код ну там в блоке перегрузки оператора добавил new void operator=(char* t) { int tl=strlen(t); a=new char; ...

new - delete - C++
Добрый день. Выделяю память для записи 10 значений координат точки. #include <iostream> using namespace std; class point { ...

delete[] - C++
Здравствуйте! Имеется след. код: char* values = new char; values = '\0'; ////ещё код//// delete values; Вопрос - почему...

new delete - C++
здраствуйте! назрел вопрос class cls1 { ... ... } class cls2 { ... cls1 *pt = new cls1();

delete this - C++
Добрый день! У меня возник такой вопрос - почему в программе возникает неопределённое поведение для объекта, в деструкторе которого...

delete[] - C++
подскажите пожалуйста как заставить это работать? Вылетает на строчке delete. Выделяю ведь память с помощью оператора new. А в идеале...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
yutr777
5 / 5 / 0
Регистрация: 07.04.2013
Сообщений: 85
27.07.2013, 09:49     new[] - delete[] #2
Допустим красно-черное дерево. Один узел пусть весит 30 байт.
Ты представь, если "ГДЕ-то" будет сохраняться эта информация, сколько это "сохранение" съест. Вдруг это телефонная база данных, хранится в виде КРДП. ИМХО, ты указал на часть памяти, а delete освободило эту часть памяти.
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,013
27.07.2013, 10:08     new[] - delete[] #3
yutr777, для одиночного объекта и нет необходимости хранить размер - его можно получить зная тип объекта. Для массивов помимо размера одного элемента необходимо знать количество элементов.
Где это будет храниться - зависит от реализации.
http://www.parashift.com/c++-faq-lit...new-array.html
RobbyZero
Сообщений: n/a
27.07.2013, 10:20     new[] - delete[] #4
0x10, спасибо за ссылку с решением. Класть размер массива слева от его первого элемента - крутое решение.
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
27.07.2013, 11:00     new[] - delete[] #5
а вот что пишет Б. Страуструп:

Для того чтобы освободить память, выделенную оператором new, операторы delete
и detete[ ] должны иметь возможность определить размер объекта. Из этого следует,
что стандартная реализация new выделяет памяти немного больше, чем потребова-
лось бы для статического объекта. Как правило, используется одно дополнительное
слово для хранения размера объекта
.
SatanaXIII
Супер-модератор
Эксперт С++
5607 / 2641 / 242
Регистрация: 01.11.2011
Сообщений: 6,499
Завершенные тесты: 1
12.03.2014, 15:53     new[] - delete[] #6
Вот нарисовал тут картинку, все думал куда бы ее приткнуть. Х)

Смысл плаката - наглядное представление почему:
new с delete хорошо
new[] с delete[] хорошо
new с delete[] проканает
new[] с delete плохо

new[] - delete[]

Схемка показывает, что будет, если динамически создавать и удалять структуру d(dot) с разными комбинациями квадратных скобок при операторах.
Представлена всего лишь одна реализация данных операторов и не факт, что ошибки будут именно такими, но на то оно и неопределенное поведение.
Croessmah
Модератор
Эксперт CЭксперт С++
13063 / 7326 / 817
Регистрация: 27.09.2012
Сообщений: 18,088
Записей в блоге: 3
Завершенные тесты: 1
12.03.2014, 15:55     new[] - delete[] #7
Цитата Сообщение от RobbyZero Посмотреть сообщение
Вопрос следующий: каким образом оператор delete[] узнал сколько элементов содержит мой массив (сколько байт), чтобы полностью освободить необходимую память?
это определяется реализацией
Jupiter
12.03.2014, 16:49
  #8

Не по теме:

Цитата Сообщение от SatanaXIII Посмотреть сообщение
Схемка показывает,
int* pointer = new d[2];

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.03.2014, 16:52     new[] - delete[]
Еще ссылки по теме:

New/Delete - C++
нужно рассмотреть конкретную ситуацию: область, выделенная желтым цветом будет очищена, при использовании delete, область выделенная...

new и delete - C++
как лучше очищать память? #include <stdio.h> #include <stdlib.h> //как лучще очищать память? int main(){ char *buff...

delete this - C++
Какие последствия могут быть при выполнении команды delete this; из какой-нибудь функции члена?

ошибка delete [] - C++
string res = "asd"; char* temp = new char; strcpy(temp, res.c_str()); //------- delete temp; когда выполняется последняя строка,...

Delete and Destructor - C++
Привет! :) Есть следующий код, в нем есть реализация сложения матриц. Matrix.cpp Matrix::Matrix(int m, int n) { row_ = m; ...


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

Или воспользуйтесь поиском по форуму:
SatanaXIII
12.03.2014, 16:52     new[] - delete[]
  #9

Не по теме:

Jupiter, ага. Косяк.

Yandex
Объявления
12.03.2014, 16:52     new[] - delete[]
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru