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

Выделение памяти... - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Lord_Voodoo
Супер-модератор
 Аватар для Lord_Voodoo
8505 / 2172 / 61
Регистрация: 07.03.2007
Сообщений: 10,839
Завершенные тесты: 1
29.12.2009, 09:50     Выделение памяти... #1
Вот решил себе ликбез устроить и возникли вопросы:

1) Почему
char* p = "fffff";
не реагирует на delete p
2) Когда надо применять delete, а когда delete []?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.12.2009, 09:50     Выделение памяти...
Посмотрите здесь:

Выделение памяти C++
Выделение памяти C++
C++ выделение памяти
Выделение памяти C++
C++ Выделение памяти (new)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
TanT
эволюционирую потихоньку
 Аватар для TanT
464 / 462 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
29.12.2009, 09:55     Выделение памяти... #2
Цитата Сообщение от Lord_Voodoo Посмотреть сообщение
Вот решил себе ликбез устроить и возникли вопросы:

1) Почему
char* p = "fffff";
не реагирует на delete p
2) Когда надо применять delete, а когда delete []?
1) указатель в статической памяти, освобождается же только динамическая.
2) delete[] - удаление массива данных, delete - освобождение только указателя.
вроде так, где смаил пожимающий плечами
Lord_Voodoo
Супер-модератор
 Аватар для Lord_Voodoo
8505 / 2172 / 61
Регистрация: 07.03.2007
Сообщений: 10,839
Завершенные тесты: 1
29.12.2009, 09:58  [ТС]     Выделение памяти... #3
TanT, вот не знаю, поэтому и спрашиваю... я вот вычитал, что если выделение памяти идет new [], то освобождать надо delete [], но ведь и delete в данном случае освобождает память даже, если выделять ее new []
TanT
эволюционирую потихоньку
 Аватар для TanT
464 / 462 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
29.12.2009, 10:43     Выделение памяти... #4
вот на чём основывался я. специально поднял.
Когда динамический объект больше не нужен, мы должны явным образом освободить отведенную под него память. Это делается с помощью оператора delete, имеющего, как и new, две формы – для единичного объекта и для массива:
// освобождение единичного объекта
delete pint;
// освобождение массива
delete[] pia;
"С++ для начинающих" Липпман, "2.2. Динамическое выделение памяти и указатели" стр. 35
Lord_Voodoo
Супер-модератор
 Аватар для Lord_Voodoo
8505 / 2172 / 61
Регистрация: 07.03.2007
Сообщений: 10,839
Завершенные тесты: 1
29.12.2009, 10:46  [ТС]     Выделение памяти... #5
TanT, это я уже тоже вычитал, но ведь мне ничто не мешает сделать так:
int* mas = new int[23];
...
delete mas;

интересно, что происходит в данном случае, а что в
delete [] mas;

раз уже решил разбираться, то надо как бы до конца выяснить все нюансы...
TanT
эволюционирую потихоньку
 Аватар для TanT
464 / 462 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
29.12.2009, 10:53     Выделение памяти... #6
Цитата Сообщение от Lord_Voodoo Посмотреть сообщение
TanT, это я уже тоже вычитал, но ведь мне ничто не мешает сделать так:
int* mas = new int[23];
...
delete mas;

интересно, что происходит в данном случае, а что в
delete [] mas;
как я искренне полагал, образуется утечка памяти, то есть освобождается только указатель на массив, а память занятая ячейками массива остаётся недоступной.
Но это пока голословно, может где-то прочёл, а где не помню.
поищу подтверждение или опровержение.
Lord_Voodoo
Супер-модератор
 Аватар для Lord_Voodoo
8505 / 2172 / 61
Регистрация: 07.03.2007
Сообщений: 10,839
Завершенные тесты: 1
29.12.2009, 11:01  [ТС]     Выделение памяти... #7
TanT, да мне кажется, что вы все же правы, спасибо за справку, но если найдет, то можно и текст по этому поводу...
TanT
эволюционирую потихоньку
 Аватар для TanT
464 / 462 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
29.12.2009, 11:22     Выделение памяти... #8
Цитата Сообщение от Lord_Voodoo Посмотреть сообщение
TanT, да мне кажется, что вы все же правы, спасибо за справку, но если найдет, то можно и текст по этому поводу...
в общем мнения разделились, спросил у старших товарищей.
1)
а) Один знаток утверждает, что между delete и delete[] нет никакой разницы, что просто удаляется указатель и усё
б) вот тут идёт бурное обсуждение и проскакивает такая мысль, но до конца не осилил http://alenacpp.blogspot.com/2008/01/delete.html

2)
а) вот ещё одна ссылка, и нашёл на одном форуме утвеждается, что сайт не врёт http://www.cppreference.com/wiki/keywords/delete?s[]=delete
б) Джесс Либерти "Освой самостоятельно С++ за 21 день" страница 350 пишет конкретно про массив: "если вы забудете установить квадоатные скобки, то из памяти будет удален только первый объект массива".
Lord_Voodoo
Супер-модератор
 Аватар для Lord_Voodoo
8505 / 2172 / 61
Регистрация: 07.03.2007
Сообщений: 10,839
Завершенные тесты: 1
29.12.2009, 11:28  [ТС]     Выделение памяти... #9
Цитата Сообщение от TanT Посмотреть сообщение
а) вот ещё одна ссылка, и нашёл на одном форуме утвеждается, что сайт не врёт http://www.cppreference.com/wiki/keywords/delete?s[]=delete
это я и читал, но тонкостей не объясняется, типа не думай, а пиши по накатанной))) поставил квадратные скобки при выделении памяти, тоже самое сделай и при освобождении
Goodwin98
 Аватар для Goodwin98
2436 / 807 / 9
Регистрация: 31.05.2009
Сообщений: 1,668
29.12.2009, 11:28     Выделение памяти... #10
В пользу второго варианта :
Если память выделялась с помощью new[], для освобождения памяти необходимо применять delete[]. Размерность массива при этом не указывается. Если квадратных скобок нет, то никакого сообщения об ошибке не выдается, но помечен как свободный будет только первый элемент массива, а остальные окажутся недоступны для дальнейших операций.
Rififi
 Аватар для Rififi
2330 / 1045 / 43
Регистрация: 03.05.2009
Сообщений: 2,656
29.12.2009, 11:53     Выделение памяти... #11
TanT,

а) Один знаток утверждает, что между delete и delete[] нет никакой разницы, что просто удаляется указатель и усё

LOL.
А этот "знаток" не пробовал Стандарт читать?

5.3.5
...
In the second alternative (delete array), the value of the operand of delete shall be the pointer value which resulted from a previous array new-expression.73) If not, the behavior is undefined.
TanT
эволюционирую потихоньку
 Аватар для TanT
464 / 462 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
29.12.2009, 12:22     Выделение памяти... #12
Цитата Сообщение от Rififi Посмотреть сообщение
TanT,
А этот "знаток" не пробовал Стандарт читать?
понятия не имею


Может дашь объяснения различию delete и delete[] своими, так сказать, словами, народ интересуется
Андрейка
410 / 214 / 24
Регистрация: 25.03.2009
Сообщений: 717
04.01.2010, 01:08     Выделение памяти... #13
имея код int *a = new int ; мы выделяем память из heap'a и настраиваем указатель на переменную типа int , в таком случае записывать значения мы можем вот так *a = 100, при вызове delete в данном случае мы рушим объект и возвращаем память в heap, но сам указатель можем настроить на другой объект, то есть допустим если он глобальный то он будет жить пока живёт сама программа)
если мы имеем int * a = new int [100] ; то мы выделяем из heap'a память под сто элементов типа int, и настраиваем указатель на первый элемент массива, при delete a, мы рушим только первый элемент и вот эту память возвращаем в heap, если мы имеем не встроенный тип например GAGA * object = new GAGA ; то мы выделяем из хипа память для объекта настраиваем этот указатель на объект ну и в данном случае вызывается конструктор по умолчанию, предположим класс GAGA реализует динамический массив то есть в конструкторе выделяется память под массив ( 100 висячее значение но не в том суть ) деструктор наш рушит массив и возвращает память в хип, то есть если мы напишем delete GAGA; то будет вызван деструктор который разрушит массив и вернёт память в хип и вторым этапом мы разрушим наш дин объект и память которую он занимал вернём в хип. с массивами объектов аналогично.

вот маленький пример
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class GAGA
{
 int *a;
public:
 GAGA()
{
 a = new int [100];
}
~GAGA()
{
 delete [] a ;
}
};
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.01.2010, 01:29     Выделение памяти...
Еще ссылки по теме:

C++ Распределение памяти. Динамическое выделение памяти
Выделение памяти C++
Выделение памяти(С = С++) C++

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

Или воспользуйтесь поиском по форуму:
ISergey
Maniac
Эксперт С++
 Аватар для ISergey
1331 / 864 / 50
Регистрация: 02.01.2009
Сообщений: 2,622
Записей в блоге: 1
04.01.2010, 01:29     Выделение памяти... #14
Могли бы просто пример сделать...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
 
class Employee{
public:
    Employee(){
        std::cout << "Employee()\n";
    }
    ~Employee(){
        std::cout << "~Employee()\n";
    }
};
 
int main()
{
    Employee *e1 = new Employee[5];
    delete[] e1;
 
    std::cout << "\n-----\n";
 
    e1 = new Employee[5];
    delete e1;
 
    system("PAUSE");
    return 0;
}
Цитата Сообщение от Result
Employee()
Employee()
Employee()
Employee()
Employee()
~Employee()
~Employee()
~Employee()
~Employee()
~Employee()

-----
Employee()
Employee()
Employee()
Employee()
Employee()
~Employee()
Для продолжения нажмите любую клавишу . . .
Yandex
Объявления
04.01.2010, 01:29     Выделение памяти...
Ответ Создать тему
Опции темы

Текущее время: 09:39. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru