С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873

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

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

Студворк — интернет-сервис помощи студентам
Вот решил себе ликбез устроить и возникли вопросы:

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

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

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

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

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

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

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

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

интересно, что происходит в данном случае, а что в
delete [] mas;
как я искренне полагал, образуется утечка памяти, то есть освобождается только указатель на массив, а память занятая ячейками массива остаётся недоступной.
Но это пока голословно, может где-то прочёл, а где не помню.
поищу подтверждение или опровержение.
1
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
29.12.2009, 11:01  [ТС]
TanT, да мне кажется, что вы все же правы, спасибо за справку, но если найдет, то можно и текст по этому поводу...
0
эволюционирую потихоньку
 Аватар для TanT
468 / 466 / 91
Регистрация: 30.06.2009
Сообщений: 1,401
29.12.2009, 11:22
Цитата Сообщение от 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
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
29.12.2009, 11:28  [ТС]
Цитата Сообщение от TanT Посмотреть сообщение
а) вот ещё одна ссылка, и нашёл на одном форуме утвеждается, что сайт не врёт http://www.cppreference.com/wiki/keywords/delete?s[]=delete
это я и читал, но тонкостей не объясняется, типа не думай, а пиши по накатанной))) поставил квадратные скобки при выделении памяти, тоже самое сделай и при освобождении
0
 Аватар для Goodwin98
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
29.12.2009, 11:28
В пользу второго варианта :
Если память выделялась с помощью new[], для освобождения памяти необходимо применять delete[]. Размерность массива при этом не указывается. Если квадратных скобок нет, то никакого сообщения об ошибке не выдается, но помечен как свободный будет только первый элемент массива, а остальные окажутся недоступны для дальнейших операций.
1
MCSD: APP BUILDER
 Аватар для IT_Exp
8795 / 1074 / 104
Регистрация: 17.06.2006
Сообщений: 32,602
29.12.2009, 11:53
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
эволюционирую потихоньку
 Аватар для TanT
468 / 466 / 91
Регистрация: 30.06.2009
Сообщений: 1,401
29.12.2009, 12:22
Цитата Сообщение от Rififi Посмотреть сообщение
TanT,
А этот "знаток" не пробовал Стандарт читать?
понятия не имею


Может дашь объяснения различию delete и delete[] своими, так сказать, словами, народ интересуется
0
425 / 229 / 87
Регистрация: 25.03.2009
Сообщений: 744
04.01.2010, 01:08
имея код 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
Эксперт С++
 Аватар для ISergey
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
04.01.2010, 01:29
Могли бы просто пример сделать...
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.01.2010, 01:29
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru