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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.04.2011, 00:37   #1
Niksan
Пользователь
 
Регистрация: 27.03.2011
Сообщений: 22
По умолчанию Деструктор

вообщем, создал объект в динамической памяти, теперь как вызвать деструктор что бы его удалить?
Niksan вне форума Ответить с цитированием
Старый 08.04.2011, 01:52   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,716
По умолчанию

кросспостинг запрешен правилами
p51x вне форума Ответить с цитированием
Старый 08.04.2011, 01:55   #3
Napkin
Пользователь
 
Аватар для Napkin
 
Регистрация: 09.12.2009
Сообщений: 25
По умолчанию

На таком простом примере все становится понятно:
Код:
class A
{
	char *s;
public:
	A()
	{
	
		s = "str";
	}
	void printStr()
	{
		printf("%s",s);
	}
	~A()
	{
                free(s);
	}
};
void main()
{
        A *obj = new A();
	obj->printStr();
	delete (obj);
        //теперь obj->printStr() уже не выполнится
}
Удел сильных - уделывать слабых
Napkin вне форума Ответить с цитированием
Старый 08.04.2011, 02:03   #4
Niksan
Пользователь
 
Регистрация: 27.03.2011
Сообщений: 22
По умолчанию

ммм... у меня получается что

char *s; //будет указателем на динамический массив
значит в дуструкторе нужно определить удаления этого динамического массива, но при delete (obj) удалится сам указатель на динамический массив, а память останется заполненной, на которую указывал s
Niksan вне форума Ответить с цитированием
Старый 08.04.2011, 02:10   #5
Niksan
Пользователь
 
Регистрация: 27.03.2011
Сообщений: 22
По умолчанию

вообщем проблема то у меня в том, что я перегрузил операции = и *, и теперь хочу написать что то типа

Код:
class A
{
  
char * s;
//деструкторы и конструкторы
//перегрузка операторов = и *

}

void main()
{
   A a,b,c;
  a=b+c;
}
Проблема в том, что b+c должен возвращать объект класса А, не изменив сами значение b и c, но если в описании функции создать временный объект, его съест деструктор... я решил воспольщоваться временным объектом в динамической памяти, и уже в операторе = удалить этот временный объект
Niksan вне форума Ответить с цитированием
Старый 08.04.2011, 02:12   #6
Niksan
Пользователь
 
Регистрация: 27.03.2011
Сообщений: 22
По умолчанию

но не могу вызвать деструктор, потому что указатель на динамическую памяти похоронен в функции, и я хз как ее вычленить от туда
Niksan вне форума Ответить с цитированием
Старый 08.04.2011, 03:19   #7
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

http://ru.wikipedia.org/wiki/%D0%9A%...BD%D0%B8%D1%8F
onewho вне форума Ответить с цитированием
Старый 08.04.2011, 03:40   #8
Napkin
Пользователь
 
Аватар для Napkin
 
Регистрация: 09.12.2009
Сообщений: 25
По умолчанию

Если перегрузить оператор * в виде
A operator* (const A &first, const A &second)
{
//объявляете новый экземпляр класса, пусть будет obj
//выполняете действия над динамическим массивом, используя передаваемые объекты

return obj;
}

Тогда не надо будет создавать ничего внешнего и вся память будет чиститься деструкторами

Но в таком случае поля класса А, связанные с вашим массивом должны быть пабликами. Ну или повозиться с get/set методами и все будет оопэшно.
Удел сильных - уделывать слабых

Последний раз редактировалось Napkin; 08.04.2011 в 03:48.
Napkin вне форума Ответить с цитированием
Старый 08.04.2011, 12:28   #9
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

Цитата:
Сообщение от Napkin Посмотреть сообщение
Но в таком случае поля класса А, связанные с вашим массивом должны быть пабликами. Ну или повозиться с get/set методами и все будет оопэшно.
для этого есть перегрузка через дружественную

Цитата:
Если перегрузить оператор * в виде
A operator* (const A &first, const A &second)
{
//объявляете новый экземпляр класса, пусть будет obj
//выполняете действия над динамическим массивом, используя передаваемые объекты

return obj;
}
я бы на вашем месте не был так уверен в этом. критическая ошибка тут обеспечена также.
onewho вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Конструктор и деструктор Ярослав Л Помощь студентам 1 18.01.2011 15:20
Конструкторы и деструктор С++ DarkSwan Помощь студентам 2 07.01.2011 12:13
Деструктор класса Lotles Общие вопросы C/C++ 2 16.10.2010 23:10
С++ (конструктор, деструктор) Kventin Помощь студентам 4 31.03.2009 18:11
Нужно написать деструктор s-t-r-i-k-e-r Помощь студентам 2 03.06.2008 23:58