powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Процедура удаления любого объекта
25 сообщений из 55, страница 1 из 3
Процедура удаления любого объекта
    #39097537
crush1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хочу сделать универсальную процедуру, которая удаляет любой объект и присваивает ему значение NULL.
Как делается обычно:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
class A
{
public:
	A()
	{
		cout << "Create" << endl;
	}

	~A()
	{
		cout << "Destroy" << endl;
	}
};
.....
A *a = new A();
...
delete a;
a = NULL;



Вместо последних двух строк хочу иметь следующую функцию:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
void MyDeleteObject(LPVOID hObject)
{
	delete hObject;
	hObject = NULL;
}

A *a = new A();
MyDeleteObject(a);



Всё отрабатывает без ошибок, но вот только деструктор класса не вызывается. Как исправить ?
Я полагаю, что компилятор не понимает, что объект-указатель hObject относится к классу "A".
Возможен ли вообще такой подход ?
...
Рейтинг: 0 / 0
Процедура удаления любого объекта
    #39097543
crush1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может завести ещё 1 параметр и в функцию передавать тип объекта ? А потом при удалении через какой-нибудь cast приводить к этому типу и удалять ?
...
Рейтинг: 0 / 0
Процедура удаления любого объекта
    #39097545
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crush1Возможен ли вообще такой подход ?
MyDeleteObject должна быть template.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Процедура удаления любого объекта
    #39097559
Зимаргл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
crush1,

Передавай не LPVOID, а какой либо прародитель XMyObject*, и виртуальный деструктор тебя спасет.
...
Рейтинг: 0 / 0
Процедура удаления любого объекта
    #39097560
Зимаргл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще можно сделать неправильно - макросом.
Шаблоном не очень хорошо - сгенерится своя функция для каждого типа.

Кроме того, нужно учитывать случай, когда у тебя массив объектов.
http://www.cplusplus.com/reference/new/operator delete []/
...
Рейтинг: 0 / 0
Процедура удаления любого объекта
    #39097608
Фотография FishHook
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
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.
class Deletable{
public:
  virtual ~Deletable() = default;
};

class Point: public Deletable{
public:
    int x;
    int y;
    ~Point(){
        std::cout << "DELETING!" << std::endl;
    }
};

using dd = Deletable *;

void erase(dd &obj){
    delete obj;
    obj = nullptr;
}


int main() {
  Deletable *p = new Point;
  std::cout << p << std::endl;
  erase(p);
  std::cout << p << std::endl;
}
...
Рейтинг: 0 / 0
Процедура удаления любого объекта
    #39097618
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЗимарглШаблоном не очень хорошо - сгенерится своя функция для каждого типа.
И что тут плохого?
...
Рейтинг: 0 / 0
Процедура удаления любого объекта
    #39097619
Фотография FishHook
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyИ что тут плохого?
раздувание кода, разве это хорошо?
...
Рейтинг: 0 / 0
Процедура удаления любого объекта
    #39097631
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FishHookAnatoly MoskovskyИ что тут плохого?
раздувание кода, разве это хорошо?монописуально. особенно в данном случае. А вот от лишней писанины избавит, и от ненужных бессмысленных наследований тоже.
...
Рейтинг: 0 / 0
Процедура удаления любого объекта
    #39097635
Фотография FishHook
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychмонописуально. особенно в данном случае.
Особенно в данном?
crush1Хочу сделать универсальную процедуру, которая удаляет любой объект
В пессимистическом варианте вы получите вариант функции для всех классов использующихся в программе.
Ну вперёд, чо!
...
Рейтинг: 0 / 0
Процедура удаления любого объекта
    #39097636
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если функция действительно нужна всем классам програмы, то ручное написание всех её вариантов, безусловно, круче шаблона ...
...
Рейтинг: 0 / 0
Процедура удаления любого объекта
    #39097656
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FishHookНу вперёд, чо!функция то пипец огромная, 3 строчки, раздует код неимоверно Куда лучше не забыть все эти классы отнаследовать от Deletable. И потом долго медитировать, задлянафига это сделано вообще.
...
Рейтинг: 0 / 0
Процедура удаления любого объекта
    #39097674
Фотография FishHook
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychFishHookНу вперёд, чо!функция то пипец огромная, 3 строчки, раздует код неимоверно Куда лучше не забыть все эти классы отнаследовать от Deletable. И потом долго медитировать, задлянафига это сделано вообще.
Наследование - основополагающий принцип ООП в С-подобных языках. Если задача решается без метапрограммирования, то её нужно решать без метапрограммирования. А если я забуду отнаследоваться от
Deletable, то получу ошибку компиляции.
...
Рейтинг: 0 / 0
Процедура удаления любого объекта
    #39097713
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FishHookраздувание кода, разве это хорошо?
Вы вообще видели объемы бинарников С++?
Там на мегабайты идет речь, а вы тут со своим раздутием на пару Кбайтов )))
...
Рейтинг: 0 / 0
Процедура удаления любого объекта
    #39097716
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crush1,

только макросом\шаблоном со всеми вытекающими
...
Рейтинг: 0 / 0
Процедура удаления любого объекта
    #39097724
Фотография FishHook
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovskyраздутием на пару Кбайтов
пару килобайтов там, пару килобайтов сям, а потом сами же гундите на форумах "что ж за программы то пошли! Элементарная тулзовина полгигабайта отжирает! Вот в наше время в 64к умудрялись приличную игру засунуть! Совсем школота обленилась!"
...
Рейтинг: 0 / 0
Процедура удаления любого объекта
    #39097760
Зимаргл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly MoskovskyЗимарглШаблоном не очень хорошо - сгенерится своя функция для каждого типа.
И что тут плохого?
Я не говорил, что плохо. Некрасиво.

К тому же ТС хочет чего то странного типа FreeAndNil, так что правильности построения я не советчик =)
...
Рейтинг: 0 / 0
Процедура удаления любого объекта
    #39097829
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crush1хочу иметь следующую функцию:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
void MyDeleteObject(LPVOID hObject)
{
	delete hObject;
	hObject = NULL;
}

A *a = new A();
MyDeleteObject(a);



Всё отрабатывает без ошибок, но вот только деструктор класса не вызывается. Как исправить ?
Я полагаю, что компилятор не понимает, что объект-указатель hObject относится к классу "A".
Возможен ли вообще такой подход ?

Чтото мне подсказывает, что указатель a тут не изменится.

Должна быть функция MyDeleteObject( T ** p_hObject){ .... *p_hObject = NULL;

Не уверен, что будет работать грязный хак - приведение void ** p_hObject к произвольному классу, например к Deletable:

delete (Deletable *)(*p_hObject);
...
Рейтинг: 0 / 0
Процедура удаления любого объекта
    #39097843
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crush1Хочу сделать универсальную процедуру, которая удаляет любой объект и присваивает ему значение NULL.
Как делается обычно:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
class A
{
public:
	A()
	{
		cout << "Create" << endl;
	}

	~A()
	{
		cout << "Destroy" << endl;
	}
};
.....
A *a = new A();
...
delete a;
a = NULL;



Вместо последних двух строк хочу иметь следующую функцию:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
void MyDeleteObject(LPVOID hObject)
{
	delete hObject;
	hObject = NULL;
}

A *a = new A();
MyDeleteObject(a);



Всё отрабатывает без ошибок, но вот только деструктор класса не вызывается. Как исправить ?
Я полагаю, что компилятор не понимает, что объект-указатель hObject относится к классу "A".
Возможен ли вообще такой подход ?
да, все правильно.

нет, такой подход невозможен, указатель должен быть типизированным. поэтому функция должна быть шаблонной.
...
Рейтинг: 0 / 0
Процедура удаления любого объекта
    #39097844
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crush1Может завести ещё 1 параметр и в функцию передавать тип объекта ? А потом при удалении через какой-нибудь cast приводить к этому типу и удалять ?

тип нельзя передать как параметр.
...
Рейтинг: 0 / 0
Процедура удаления любого объекта
    #39097845
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЗимарглЕще можно сделать неправильно - макросом.
Шаблоном не очень хорошо - сгенерится своя функция для каждого типа.

Кроме того, нужно учитывать случай, когда у тебя массив объектов.
http://www.cplusplus.com/reference/new/operator delete[]/


ну и пусть генерируется, она тут же заинлайнится.
...
Рейтинг: 0 / 0
Процедура удаления любого объекта
    #39097847
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FishHookegorychмонописуально. особенно в данном случае.
Особенно в данном?
crush1Хочу сделать универсальную процедуру, которая удаляет любой объект
В пессимистическом варианте вы получите вариант функции для всех классов использующихся в программе.
Ну вперёд, чо!


да и хрен с ним!
...
Рейтинг: 0 / 0
Процедура удаления любого объекта
    #39097850
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
такая функция, разумеется, должна принимать ссылку на указатель, чтобы иметь возможность его обнулять.
...
Рейтинг: 0 / 0
Процедура удаления любого объекта
    #39097873
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivтакая функция, разумеется, должна принимать ссылку на указатель, чтобы иметь возможность его обнулять. В "советах" читал, что ссылки следует всегда делать константными. Это в духе C, где переменные передаваемые по значению не менялись. Синтаксически в C++ передача переменной по ссылке и по значению не отличаются.

Константная ссылка в C++ может принять временный объект или литерал, что расширяет область применения функции.
...
Рейтинг: 0 / 0
Процедура удаления любого объекта
    #39097874
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mcureenabВ "советах" читал, что ссылки следует всегда делать константными.

Либо это вредные советы, либо ты их неправильно читал. Константные ссылки используют
вместо передачи по значению для того, чтобы не создавать временные объекты и тратить время
на копи-конструктор.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25 сообщений из 55, страница 1 из 3
Форумы / C++ [игнор отключен] [закрыт для гостей] / Процедура удаления любого объекта
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]