Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Lord_Voodoo
Супер-модератор
8594 / 2211 / 61
Регистрация: 07.03.2007
Сообщений: 10,974
Завершенные тесты: 1
#1

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

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

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

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

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

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

Выделение памяти - C++
Скажите пожалуйста что не так? Не могу получить доступ к элементу str = 12, stlb = 3 bool** tempValues = new(bool*); for(int i = 0;...

Выделение памяти - C++
Часто возникает такая проблема, когда конфигурирую проект как Release происходит ошибка выделения памяти (при вызывании new), например...

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

выделение памяти - C++
#include <iostream> using namespace std; class Matrix { int m, n; public: float **M; Matrix(int a, int b); void...

13
TanT
эволюционирую потихоньку
466 / 464 / 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 - освобождение только указателя.
вроде так, где смаил пожимающий плечами
0
Lord_Voodoo
Супер-модератор
8594 / 2211 / 61
Регистрация: 07.03.2007
Сообщений: 10,974
Завершенные тесты: 1
29.12.2009, 09:58  [ТС] #3
TanT, вот не знаю, поэтому и спрашиваю... я вот вычитал, что если выделение памяти идет new [], то освобождать надо delete [], но ведь и delete в данном случае освобождает память даже, если выделять ее new []
0
TanT
эволюционирую потихоньку
466 / 464 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
29.12.2009, 10:43 #4
вот на чём основывался я. специально поднял.
Когда динамический объект больше не нужен, мы должны явным образом освободить отведенную под него память. Это делается с помощью оператора delete, имеющего, как и new, две формы – для единичного объекта и для массива:
// освобождение единичного объекта
delete pint;
// освобождение массива
delete[] pia;
"С++ для начинающих" Липпман, "2.2. Динамическое выделение памяти и указатели" стр. 35
1
Lord_Voodoo
Супер-модератор
8594 / 2211 / 61
Регистрация: 07.03.2007
Сообщений: 10,974
Завершенные тесты: 1
29.12.2009, 10:46  [ТС] #5
TanT, это я уже тоже вычитал, но ведь мне ничто не мешает сделать так:
int* mas = new int[23];
...
delete mas;

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

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

интересно, что происходит в данном случае, а что в
delete [] mas;
как я искренне полагал, образуется утечка памяти, то есть освобождается только указатель на массив, а память занятая ячейками массива остаётся недоступной.
Но это пока голословно, может где-то прочёл, а где не помню.
поищу подтверждение или опровержение.
1
Lord_Voodoo
Супер-модератор
8594 / 2211 / 61
Регистрация: 07.03.2007
Сообщений: 10,974
Завершенные тесты: 1
29.12.2009, 11:01  [ТС] #7
TanT, да мне кажется, что вы все же правы, спасибо за справку, но если найдет, то можно и текст по этому поводу...
0
TanT
эволюционирую потихоньку
466 / 464 / 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 пишет конкретно про массив: "если вы забудете установить квадоатные скобки, то из памяти будет удален только первый объект массива".
1
Lord_Voodoo
Супер-модератор
8594 / 2211 / 61
Регистрация: 07.03.2007
Сообщений: 10,974
Завершенные тесты: 1
29.12.2009, 11:28  [ТС] #9
Цитата Сообщение от TanT Посмотреть сообщение
а) вот ещё одна ссылка, и нашёл на одном форуме утвеждается, что сайт не врёт http://www.cppreference.com/wiki/keywords/delete?s[]=delete
это я и читал, но тонкостей не объясняется, типа не думай, а пиши по накатанной))) поставил квадратные скобки при выделении памяти, тоже самое сделай и при освобождении
0
Goodwin98
2517 / 813 / 9
Регистрация: 31.05.2009
Сообщений: 1,670
29.12.2009, 11:28 #10
В пользу второго варианта :
Если память выделялась с помощью new[], для освобождения памяти необходимо применять delete[]. Размерность массива при этом не указывается. Если квадратных скобок нет, то никакого сообщения об ошибке не выдается, но помечен как свободный будет только первый элемент массива, а остальные окажутся недоступны для дальнейших операций.
1
Rififi
2359 / 1052 / 44
Регистрация: 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.
0
TanT
эволюционирую потихоньку
466 / 464 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
29.12.2009, 12:22 #12
Цитата Сообщение от Rififi Посмотреть сообщение
TanT,
А этот "знаток" не пробовал Стандарт читать?
понятия не имею


Может дашь объяснения различию delete и delete[] своими, так сказать, словами, народ интересуется
0
Андрейка
420 / 224 / 27
Регистрация: 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
ISergey
Maniac
Эксперт С++
1381 / 892 / 54
Регистрация: 02.01.2009
Сообщений: 2,685
Записей в блоге: 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
04.01.2010, 01:29
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.01.2010, 01:29
Привет! Вот еще темы с ответами:

Не выделение памяти - C++
По какой причине не работает это программа ? #include&lt;iostream&gt; #include &lt;string&gt; using namespace std; int main () ...

Выделение памяти - C++
Платформа и компилятор x64. Установлено 64Gb ОЗУ, 60Gb из них откусил SQL Server. Пытаюсь сделать следующее: struct Dictionary { ...

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

выделение памяти - C++
Здравствуйте, помогите пожалуйста исправить ошибку, это лишь малая часть кода. В задании: поле name должно быть динамическим: char...


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

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

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