Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.11.2010, 19:35   #1
Кипящий чайник
Форумчанин
 
Регистрация: 17.12.2009
Сообщений: 101
Хорошо Освобождение памяти при условии

В программе динамически выделяется память (при помощи new) под каждый объект какого-либо класса. Классов несколько, и почти каждый из них содержит указатель на другой.
В ходе работы программы память некоторых объектов динамически особождается (при помощи delete). Но некоторые могут остаться незатронутыми, поскольку того требует программа.
Но затем наступает время, когда нужно выделить память под новые объекты, а все старые желательно бы удалить. Можно написать:

Код:
delete Cl1_obj1;
Но проблема в том, что в Cl1_obj1 содержится указатель, например, на Cl2_obj2. И он может быть уже освобождён, а может, и нет. Если я удалю Cl1_obj1, то сотрю только указатель, а Cl2_obj2 останется нетронутым.
Если он уже стёрт, то прекрасно. А если нет? Повторное освобождение уже освобождённой переменной вызывает ошибку в программе.
Я пытался вывести условие, чтобы программа освобождала память, если она ещё не освобождена. Вот упрощённый пример:

Код:
#include <iostream>

using namespace std;

class foo{
public:
	int i;
	foo(int j = 1): i(j){}
};

foo *poo;

int main(){
	poo = new foo(5);
	cout << poo->i << endl;

	delete poo;
	if(poo) delete poo;
	cout << poo->i << endl;

	return 0;
}
Получается всё не так, как я хотел. Всё равно происходит ошибка. Изменишь условие на if(!poo) - тогда вроде бы работает. Но если я уберу строчку с первой командой delete, то память не освободится. Как же мне вывести условие?
Кипящий чайник вне форума Ответить с цитированием
Старый 22.11.2010, 20:00   #2
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Попробуйте вот так:
Код:

int main(){
	poo = new foo(5);
	cout << poo->i << endl;

	delete poo;
	poo = 0;
	if(poo) 
		{
		delete poo;
		poo = 0;
		}
	cout << poo->i << endl;   //Тут будет ошибка

	return 0;
}
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 23.11.2010, 17:31   #3
Кипящий чайник
Форумчанин
 
Регистрация: 17.12.2009
Сообщений: 101
По умолчанию

Как всегда, сам не допёр... Спасибо большое!
Кипящий чайник вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Освобождение памяти Seran4ek Общие вопросы Delphi 7 21.12.2009 18:07
Освобождение памяти PUH Помощь студентам 1 22.11.2009 17:14
Освобождение памяти VadEr Общие вопросы Delphi 2 17.04.2009 22:23
Освобождение памяти AlexandrSid Общие вопросы Delphi 3 02.02.2009 13:45
Освобождение Памяти в Си volotsky Помощь студентам 2 16.12.2008 22:36