Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
Супер-модератор
8765 / 2497 / 142
Регистрация: 07.03.2007
Сообщений: 11,847
1

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

29.12.2009, 09:50. Показов 1284. Ответов 13
Метки нет (Все метки)

Вот решил себе ликбез устроить и возникли вопросы:

1) Почему
char* p = "fffff";
не реагирует на delete p
2) Когда надо применять delete, а когда delete []?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.12.2009, 09:50
Ответы с готовыми решениями:

Выделение памяти, проверка на утечку памяти
Интересуют два вопроса: 1. Правильно ли устроен алгоритм выделения, удаление и запись ячейки...

Распределение памяти. Динамическое выделение памяти
an-1 an-2 ... a2

выделение памяти
есть класс множество. необходимо создать класс "правило", одним из методов которого является...

Выделение памяти
Нубский вопрос, но не могу до конца разобраться. Допустим, есть простое определение переменной: ...

13
эволюционирую потихоньку
468 / 466 / 91
Регистрация: 30.06.2009
Сообщений: 1,401
29.12.2009, 09:55 2
Цитата Сообщение от Lord_Voodoo Посмотреть сообщение
Вот решил себе ликбез устроить и возникли вопросы:

1) Почему
char* p = "fffff";
не реагирует на delete p
2) Когда надо применять delete, а когда delete []?
1) указатель в статической памяти, освобождается же только динамическая.
2) delete[] - удаление массива данных, delete - освобождение только указателя.
вроде так, где смаил пожимающий плечами
0
Супер-модератор
8765 / 2497 / 142
Регистрация: 07.03.2007
Сообщений: 11,847
29.12.2009, 09:58  [ТС] 3
TanT, вот не знаю, поэтому и спрашиваю... я вот вычитал, что если выделение памяти идет new [], то освобождать надо delete [], но ведь и delete в данном случае освобождает память даже, если выделять ее new []
0
эволюционирую потихоньку
468 / 466 / 91
Регистрация: 30.06.2009
Сообщений: 1,401
29.12.2009, 10:43 4
вот на чём основывался я. специально поднял.
Когда динамический объект больше не нужен, мы должны явным образом освободить отведенную под него память. Это делается с помощью оператора delete, имеющего, как и new, две формы – для единичного объекта и для массива:
// освобождение единичного объекта
delete pint;
// освобождение массива
delete[] pia;
"С++ для начинающих" Липпман, "2.2. Динамическое выделение памяти и указатели" стр. 35
1
Супер-модератор
8765 / 2497 / 142
Регистрация: 07.03.2007
Сообщений: 11,847
29.12.2009, 10:46  [ТС] 5
TanT, это я уже тоже вычитал, но ведь мне ничто не мешает сделать так:
int* mas = new int[23];
...
delete mas;

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

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

интересно, что происходит в данном случае, а что в
delete [] mas;
как я искренне полагал, образуется утечка памяти, то есть освобождается только указатель на массив, а память занятая ячейками массива остаётся недоступной.
Но это пока голословно, может где-то прочёл, а где не помню.
поищу подтверждение или опровержение.
1
Супер-модератор
8765 / 2497 / 142
Регистрация: 07.03.2007
Сообщений: 11,847
29.12.2009, 11:01  [ТС] 7
TanT, да мне кажется, что вы все же правы, спасибо за справку, но если найдет, то можно и текст по этому поводу...
0
эволюционирую потихоньку
468 / 466 / 91
Регистрация: 30.06.2009
Сообщений: 1,401
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 пишет конкретно про массив: "если вы забудете установить квадоатные скобки, то из памяти будет удален только первый объект массива".
1
Супер-модератор
8765 / 2497 / 142
Регистрация: 07.03.2007
Сообщений: 11,847
29.12.2009, 11:28  [ТС] 9
Цитата Сообщение от TanT Посмотреть сообщение
а) вот ещё одна ссылка, и нашёл на одном форуме утвеждается, что сайт не врёт http://www.cppreference.com/wiki/keywords/delete?s[]=delete
это я и читал, но тонкостей не объясняется, типа не думай, а пиши по накатанной))) поставил квадратные скобки при выделении памяти, тоже самое сделай и при освобождении
0
2531 / 827 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
29.12.2009, 11:28 10
В пользу второго варианта :
Если память выделялась с помощью new[], для освобождения памяти необходимо применять delete[]. Размерность массива при этом не указывается. Если квадратных скобок нет, то никакого сообщения об ошибке не выдается, но помечен как свободный будет только первый элемент массива, а остальные окажутся недоступны для дальнейших операций.
1
MCSD: APP BUILDER
8791 / 1070 / 104
Регистрация: 17.06.2006
Сообщений: 12,603
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.
0
эволюционирую потихоньку
468 / 466 / 91
Регистрация: 30.06.2009
Сообщений: 1,401
29.12.2009, 12:22 12
Цитата Сообщение от Rififi Посмотреть сообщение
TanT,
А этот "знаток" не пробовал Стандарт читать?
понятия не имею


Может дашь объяснения различию delete и delete[] своими, так сказать, словами, народ интересуется
0
423 / 227 / 87
Регистрация: 25.03.2009
Сообщений: 744
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 ;
}
};
0
Maniac
Эксперт С++
1456 / 957 / 159
Регистрация: 02.01.2009
Сообщений: 2,816
Записей в блоге: 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()
Для продолжения нажмите любую клавишу . . .
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.01.2010, 01:29

Выделение памяти
Здравствуйте! #include&lt;iostream&gt; int main() { int *mass = new int ; int *mass2 = new int ;...

Выделение памяти
Сразу кидаю код. #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;memory&gt; using namespace...

Выделение памяти
Добрый вечер. Немогу никак понять некоторые тонкости выделения памяти. Во первых: на что...

До выделение памяти в С++
Всем приветик. Вообщем есть некоторые сложности с довыделение памяти... Что я хочу сделать: есть...


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

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

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