Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
4 / 8 / 0
Регистрация: 08.02.2013
Сообщений: 52
1

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

01.04.2013, 01:09. Просмотров 1067. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.04.2013, 01:09
Ответы с готовыми решениями:

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

не могу написать батник, не понимаю сути задания
Написать файл, в котором задается 2 числовых параметра, первый параметр вводится пользователем с...

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

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

7
быдлокодер
1719 / 906 / 106
Регистрация: 04.06.2008
Сообщений: 5,614
01.04.2013, 02:17 2
Ты всё правильно делаешь, ты вызвал
C++
1
delete[] ResPtr;
всё, не эксперементируй больше с этим указателем. После этого там вовсе необязательно должен быть ноль- да и почему он там должен быть, ноль-то? Ты сказал системе- всё, этот адрес мне не нужен и всё, она когда ей надо, тогда и заберёт его. Кстати ничего удивительного если он будет после delete рабочим. Значит система не забрала ещё себе участок памяти, на который указывает ResPtr. И, повторюсь, после того как заберёт, она не обязана написать в переменную ResPtr NULL.
1
4 / 8 / 0
Регистрация: 08.02.2013
Сообщений: 52
01.04.2013, 02:39  [ТС] 3
Цитата Сообщение от kravam Посмотреть сообщение
Ты всё правильно делаешь, ты вызвал
C++
1
delete[] ResPtr;
всё, не эксперементируй больше с этим указателем. После этого там вовсе необязательно должен быть ноль- да и почему он там должен быть, ноль-то? Ты сказал системе- всё, этот адрес мне не нужен и всё, она когда ей надо, тогда и заберёт его. Кстати ничего удивительного если он будет после delete рабочим. Значит система не забрала ещё себе участок памяти, на который указывает ResPtr. И, повторюсь, после того как заберёт, она не обязана написать в переменную ResPtr NULL.
Спасибо! иными словами удаление не есть стирание, как и в случае с прозаической корзиной. Это просто гарантия того, что системе не придётся раздумывать, что хранить и что переписывать, если вдруг. А я-то голову ломаю...
0
5477 / 4872 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
01.04.2013, 02:53 4
Цитата Сообщение от Stranger777 Посмотреть сообщение
иными словами удаление не есть стирание, как и в случае с прозаической корзиной.
Тут другое. В корзине гарантированно сохраняется, тут - неопределено, может сотрётся сразу, может не сразу. Память объявлена свободной.
0
4 / 8 / 0
Регистрация: 08.02.2013
Сообщений: 52
01.04.2013, 03:05  [ТС] 5
Цитата Сообщение от alsav22 Посмотреть сообщение
Тут другое. В корзине гарантированно сохраняется, тут - неопределено, может сотрётся сразу, может не сразу. Память объявлена свободной.
Я имею в виду восстановление файлов после удаления уже из самой корзины, а не просто когда они там лежат: точно так же, если файлы удалены оттуда, они больше не отображаются пользователю, всё ещё существуют, но система начинает считать их пригодными для перезаписи, аналогично, пространство диска объявлено свободным.
0
5477 / 4872 / 831
Регистрация: 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
Миниатюры
Не могу разобраться с указателями(не понимаю сути освобождения памяти)  
5477 / 4872 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
01.04.2013, 03:21 7
Чтобы память под самим указателем освободилась:
C++
1
delete res;
Только перед этим, нужно убрать вызов деструктора, а то будет двойное освобождение памяти.
1
4 / 8 / 0
Регистрация: 08.02.2013
Сообщений: 52
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.04.2013, 03:31

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

Не могу разобраться с указателями
Здравствуйте, никак не могу разобраться с этими указателями, вот есть одна функция: //Вводимо...

Си, не могу разобраться с указателями
Здравствуйте, проблема с функцией sort, компилятор ругается на указатели, не могу разобраться. ...

Не могу разобраться с указателями и смещение в массиве
// Дан массив, содержащий 20 неотрицательных целых чисел. Пиком называется не крайний элемент...


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

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

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