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

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

Войти
Регистрация
Восстановить пароль
 
Stranger777
4 / 8 / 0
Регистрация: 08.02.2013
Сообщений: 47
#1

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

01.04.2013, 01:09. Просмотров 697. Ответов 7
Метки нет (Все метки)

Вот я тоже дуб в указателях... помогите пожалуйста кому не лениво... с горем пополам заработал 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();
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.04.2013, 01:09
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не могу разобраться с указателями(не понимаю сути освобождения памяти) (C++):

Не понимаю логики освобождения памяти - C++
Не могу понять каким образом освобождается память если ее ячейки всеравно заполнены, и более того в дальнейшем не используются.. ...

Не могу разобраться в сути работы программы :( - C++
#include &lt;iostream&gt; using namespace std; int main() { int i; float number, largest, largest2;

Не могу разобраться с указателями - C++
Здравствуйте, никак не могу разобраться с этими указателями, вот есть одна функция: //Вводимо матрицю int **Matrix(int n) {int...

Не могу разобраться с указателями - C++
Здраствуйте все вот короче мне задали задачки на Си написать вот они собствено : 1.Даны два массива, упорядоченных по возрастанию: А и B....

Не могу разобраться с указателями! - C++
Читаю Шилдт C++, не как не могу понять систему с указателями, вроде вот вот все понял что это просто типа ярлыков для переменных и не более...

Как создать 2-ое дерево со значениями 1-го? Не могу разобраться с указателями - C++
Вот код(недоработанный): #include &lt;iostream&gt; #include &lt;cstdlib&gt; #include &lt;ctime&gt; using namespace std; struct sNode { int...

7
kravam
быдлокодер
1700 / 887 / 45
Регистрация: 04.06.2008
Сообщений: 5,494
01.04.2013, 02:17 #2
Ты всё правильно делаешь, ты вызвал
C++
1
delete[] ResPtr;
всё, не эксперементируй больше с этим указателем. После этого там вовсе необязательно должен быть ноль- да и почему он там должен быть, ноль-то? Ты сказал системе- всё, этот адрес мне не нужен и всё, она когда ей надо, тогда и заберёт его. Кстати ничего удивительного если он будет после delete рабочим. Значит система не забрала ещё себе участок памяти, на который указывает ResPtr. И, повторюсь, после того как заберёт, она не обязана написать в переменную ResPtr NULL.
1
Stranger777
4 / 8 / 0
Регистрация: 08.02.2013
Сообщений: 47
01.04.2013, 02:39  [ТС] #3
Цитата Сообщение от kravam Посмотреть сообщение
Ты всё правильно делаешь, ты вызвал
C++
1
delete[] ResPtr;
всё, не эксперементируй больше с этим указателем. После этого там вовсе необязательно должен быть ноль- да и почему он там должен быть, ноль-то? Ты сказал системе- всё, этот адрес мне не нужен и всё, она когда ей надо, тогда и заберёт его. Кстати ничего удивительного если он будет после delete рабочим. Значит система не забрала ещё себе участок памяти, на который указывает ResPtr. И, повторюсь, после того как заберёт, она не обязана написать в переменную ResPtr NULL.
Спасибо! иными словами удаление не есть стирание, как и в случае с прозаической корзиной. Это просто гарантия того, что системе не придётся раздумывать, что хранить и что переписывать, если вдруг. А я-то голову ломаю...
0
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
01.04.2013, 02:53 #4
Цитата Сообщение от Stranger777 Посмотреть сообщение
иными словами удаление не есть стирание, как и в случае с прозаической корзиной.
Тут другое. В корзине гарантированно сохраняется, тут - неопределено, может сотрётся сразу, может не сразу. Память объявлена свободной.
0
Stranger777
4 / 8 / 0
Регистрация: 08.02.2013
Сообщений: 47
01.04.2013, 03:05  [ТС] #5
Цитата Сообщение от alsav22 Посмотреть сообщение
Тут другое. В корзине гарантированно сохраняется, тут - неопределено, может сотрётся сразу, может не сразу. Память объявлена свободной.
Я имею в виду восстановление файлов после удаления уже из самой корзины, а не просто когда они там лежат: точно так же, если файлы удалены оттуда, они больше не отображаются пользователю, всё ещё существуют, но система начинает считать их пригодными для перезаписи, аналогично, пространство диска объявлено свободным.
0
alsav22
5425 / 4820 / 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;
По адресу, который в указателе, уже мусор.
1
Миниатюры
Не могу разобраться с указателями(не понимаю сути освобождения памяти)  
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
01.04.2013, 03:21 #7
Чтобы память под самим указателем освободилась:
C++
1
delete res;
Только перед этим, нужно убрать вызов деструктора, а то будет двойное освобождение памяти.
1
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;
По адресу, который в указателе, уже мусор.
Только перед этим, нужно убрать вызов деструктора, а то будет двойное освобождение памяти.
Понято. всем спасибо!
0
01.04.2013, 03:31
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.04.2013, 03:31
Привет! Вот еще темы с ответами:

Не понимаю сути AObject * (*create)() - C++
Есть абстрактный класс AObject В нём есть метод static int registerClass(AObject * (*create)()); Вот сам метод static int...

Не могу разобраться с классами и освобождением памяти - C++
Есть задача. Создать класс матрица Данный класс содержит указатель на float, размер строк и столбцов и состояние ошибки. Определить...

Проверка освобождения памяти (new, delete) - C++
Всем привет. Программы помаленьку становятся сложнее. Появляются самодельные контейнеры внутри других самодельных контейнеров внутри...

Деструкторы, аналоги освобождения памяти - C++
Доброго времени суток. Возник следующий вопрос. Какие, помимо деструкторов, способы очистки памяти существуют. Спасибо за уделенное...


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

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

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