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

Не могу разобраться с указателями(не понимаю сути освобождения памяти) - C++

Восстановить пароль Регистрация
 
Stranger777
4 / 8 / 0
Регистрация: 08.02.2013
Сообщений: 47
01.04.2013, 01:09     Не могу разобраться с указателями(не понимаю сути освобождения памяти) #1
Вот я тоже дуб в указателях... помогите пожалуйста кому не лениво... с горем пополам заработал Enter (ноуту пора в утиль), и вот (вопросы изложены в комментариях):

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
26
27
28
29
30
31
32
33
34
35
#include <iostream>
 
using namespace std;
 
class TestResource{
private:
    int ResVar;
    int ResIndex;
    int ResValue;
    int* ResPtr; // указатель, по которому буду обращаться к массиву int'ов
public:
    TestResource::TestResource(int ResVar){ResPtr = new int[ResVar];}; // Вот он массив, параметр передавался в конструкторе.
    ~TestResource(){if(ResPtr){
        delete[] ResPtr; /* Это массиву конец или всё же только первому элементу? 
                         ...или вообще не то?  */
    }};
    int TestResource::setElement(int ResIndex, int ResValue){
        ResPtr[ResIndex] = ResValue;
        return ResValue;
    };
    int TestResource::getElement(int ResIndex){return ResPtr[ResIndex];};
    int* TestResource::returnPtr(){return ResPtr;};
};
 
int main(){
    TestResource* res = new TestResource(20); // создаля массив
    res->setElement(5, 20);
    cout << res->getElement(5) << endl; // Всё верно. Выводится 20, как и надо было.
    res->~TestResource(); // Вот это должно бы по логике вещей уничтожить массив, сообразно delete[] ResPtr.
    cout << res->returnPtr(); /* Но нихрена подобного. Или я всё делаю так, как надо, то есть
                              сообразно вот этому: [url]http://msdn.microsoft.com/en-us/library/6t4fe76c(v=vs.80).aspx[/url], 
                              но не понимаю сути освобождения памяти? почему тут не что-то вроде null, а число, что это за число, если не адрес и почему это работает именно 
                              так, а не иначе? */ 
    getchar();
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.04.2013, 01:09     Не могу разобраться с указателями(не понимаю сути освобождения памяти)
Посмотрите здесь:

Не понимаю логики освобождения памяти C++
Не понимаю сути AObject * (*create)() C++
C++ Не могу разобраться с указателями
C++ Не могу разобраться с указателями
C++ Не могу разобраться с указателями!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
01.04.2013, 02:17     Не могу разобраться с указателями(не понимаю сути освобождения памяти) #2
Ты всё правильно делаешь, ты вызвал
C++
1
delete[] ResPtr;
всё, не эксперементируй больше с этим указателем. После этого там вовсе необязательно должен быть ноль- да и почему он там должен быть, ноль-то? Ты сказал системе- всё, этот адрес мне не нужен и всё, она когда ей надо, тогда и заберёт его. Кстати ничего удивительного если он будет после delete рабочим. Значит система не забрала ещё себе участок памяти, на который указывает ResPtr. И, повторюсь, после того как заберёт, она не обязана написать в переменную ResPtr NULL.
Stranger777
4 / 8 / 0
Регистрация: 08.02.2013
Сообщений: 47
01.04.2013, 02:39  [ТС]     Не могу разобраться с указателями(не понимаю сути освобождения памяти) #3
Цитата Сообщение от kravam Посмотреть сообщение
Ты всё правильно делаешь, ты вызвал
C++
1
delete[] ResPtr;
всё, не эксперементируй больше с этим указателем. После этого там вовсе необязательно должен быть ноль- да и почему он там должен быть, ноль-то? Ты сказал системе- всё, этот адрес мне не нужен и всё, она когда ей надо, тогда и заберёт его. Кстати ничего удивительного если он будет после delete рабочим. Значит система не забрала ещё себе участок памяти, на который указывает ResPtr. И, повторюсь, после того как заберёт, она не обязана написать в переменную ResPtr NULL.
Спасибо! иными словами удаление не есть стирание, как и в случае с прозаической корзиной. Это просто гарантия того, что системе не придётся раздумывать, что хранить и что переписывать, если вдруг. А я-то голову ломаю...
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
01.04.2013, 02:53     Не могу разобраться с указателями(не понимаю сути освобождения памяти) #4
Цитата Сообщение от Stranger777 Посмотреть сообщение
иными словами удаление не есть стирание, как и в случае с прозаической корзиной.
Тут другое. В корзине гарантированно сохраняется, тут - неопределено, может сотрётся сразу, может не сразу. Память объявлена свободной.
Stranger777
4 / 8 / 0
Регистрация: 08.02.2013
Сообщений: 47
01.04.2013, 03:05  [ТС]     Не могу разобраться с указателями(не понимаю сути освобождения памяти) #5
Цитата Сообщение от alsav22 Посмотреть сообщение
Тут другое. В корзине гарантированно сохраняется, тут - неопределено, может сотрётся сразу, может не сразу. Память объявлена свободной.
Я имею в виду восстановление файлов после удаления уже из самой корзины, а не просто когда они там лежат: точно так же, если файлы удалены оттуда, они больше не отображаются пользователю, всё ещё существуют, но система начинает считать их пригодными для перезаписи, аналогично, пространство диска объявлено свободным.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
01.04.2013, 03:09     Не могу разобраться с указателями(не понимаю сути освобождения памяти) #6
И в своём коде, вы не совсем то проверяете. Освобождается память под массивом, на который ссылается указатель. Сам же указатель будет жив пока память под объектом не осободится. Вот так попробуйте:
C++
1
2
3
4
5
6
7
TestResource* res = new TestResource(20); // создаля массив
    res->setElement(5, 20);
    cout << res->getElement(5) << endl; // Всё верно. Выводится 20, как и надо было.
    cout << res->returnPtr() << endl;
    res->~TestResource(); // Вот это должно бы по логике вещей уничтожить массив, сообразно delete[] ResPtr.
    cout << res->returnPtr() << endl; 
    cout << res->getElement(5) << endl;
По адресу, который в указателе, уже мусор.
Миниатюры
Не могу разобраться с указателями(не понимаю сути освобождения памяти)  
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
01.04.2013, 03:21     Не могу разобраться с указателями(не понимаю сути освобождения памяти) #7
Чтобы память под самим указателем освободилась:
C++
1
delete res;
Только перед этим, нужно убрать вызов деструктора, а то будет двойное освобождение памяти.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.04.2013, 03:31     Не могу разобраться с указателями(не понимаю сути освобождения памяти)
Еще ссылки по теме:

Как создать 2-ое дерево со значениями 1-го? Не могу разобраться с указателями C++
C++ Не могу разобраться в сути работы программы :(
Стратегия выделения/освобождения памяти C++

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

Или воспользуйтесь поиском по форуму:
Stranger777
4 / 8 / 0
Регистрация: 08.02.2013
Сообщений: 47
01.04.2013, 03:31  [ТС]     Не могу разобраться с указателями(не понимаю сути освобождения памяти) #8
Цитата Сообщение от alsav22 Посмотреть сообщение
И в своём коде, вы не совсем то проверяете. Освобождается память под массивом, на который ссылается указатель. Сам же указатель будет жив пока память под объектом не осободится. Вот так попробуйте:
C++
1
2
3
4
5
6
7
TestResource* res = new TestResource(20); // создаля массив
    res->setElement(5, 20);
    cout << res->getElement(5) << endl; // Всё верно. Выводится 20, как и надо было.
    cout << res->returnPtr() << endl;
    res->~TestResource(); // Вот это должно бы по логике вещей уничтожить массив, сообразно delete[] ResPtr.
    cout << res->returnPtr() << endl; 
    cout << res->getElement(5) << endl;
По адресу, который в указателе, уже мусор.
Только перед этим, нужно убрать вызов деструктора, а то будет двойное освобождение памяти.
Понято. всем спасибо!
Yandex
Объявления
01.04.2013, 03:31     Не могу разобраться с указателями(не понимаю сути освобождения памяти)
Ответ Создать тему
Опции темы

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