Удаляется ли объект при присвоении ему значения null?

235
04 января 2018, 20:25

Есть полу-нативный класс c++/c++-cli, который управляется из c#, при этом один из его элементов/составляющих классов, должен быть удален из памяти незамедлительно если ему было присвоено значение null, и мне теперь непонятно, если экземпляр данного класса не будет уничтожен, то все приложение упадет в один миг. Ведь если верить GC, то он удаляет экземпляр из памяти только в том случае когда он этого захочет, но мне необходимо именно удалить его в тот момент, когда было присвоено значение null. Понимаю что есть метод Dispose(), но его недостаточно, т.к. методы класса, и сам класс не должны быть доступны после их удаления, чего Dispose() не гарантирует, а плевать в лицо исключениями, это затормозить работу приложения.

Можно ли перегрузить оператор присваивания так, что бы как только было передано значение null, данные класс уничтожил ссылку на себя? Желательно без помощи GC.

Answer 1

Вы не можете «уничтожить» экземпляр управляемого класса. Присваивая ссылке null, вы тем самым не обнуляете другие возможные ссылки на объект. Соответственно, по другим ссылкам объект будет всё ещё доступен. Вызов Dispose() лишь позволяет объекту подчистить за собой, но это не приведёт к «запрету» другим объектам вызывать методы данного класса (и получать исключения). Обеспечить, чтобы у других объектов не было ссылок на ваш объект (или они были, но объекты ими бы не пользовались) — ваша задача.

Перегрузить оператор присваивания ссылки невозможно. Но даже если бы это было возможно, что бы вы в нём могли сделать? Те, у кого есть ссылка, будут всё ещё иметь эту ссылку.

Если это нативный класс, вы можете деаллоцировать его при помощи delete по указателю на него, но вы должны обеспечить, чтобы те, у кого всё ещё есть указатель на данный объект, более не пользовались им. Иначе вы получаете undefined behavior.

READ ALSO
Деление числа по разрядам

Деление числа по разрядам

Доброго времени суток всем! Недавно столкнулся с такой проблемой: необходимо разделить число типа float по разрядам, пример: "1590270,2018" -> "1 590 270,2018"Попытался...

226
Вывод строки перед и после

Вывод строки перед и после

Вtxt записана такие строки, к примеру

202
Проверка поля на наличие в нем определенного числа JS [требует правки]

Проверка поля на наличие в нем определенного числа JS [требует правки]

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

252