Есть ли веские основания для не clear/zero данные элемента элемента элемента в деструкторе? Похоже, что это следует рассматривать стандартную практику для опрятности или личной жизни, так как существует мыслимые способы повторно считывать данные с удаленным объекта:Должны ли данные члена всегда очищаться/нулеваться в деструкторе?
#include <iostream>
class Box {
public:
Box(int s) : secret(s), buffer(this) {}
~Box() {}
/*BETTER DESTRUCTOR ~Box() {secret = 0;}*/
void print() {std::cout << secret << std::endl;}
private:
void* buffer;
int secret;
};
int main() {
Box* carton = new Box(8675309);
Box* crate = carton;
delete carton;
crate->print();
}
(Обратите внимание, что buffer
необходимо только потому, что без него, что-то переписывает secret
перед тем crate->print()
.)
ли он принимать «слишком много времени» обнулить данные элемента, так что это считается не стоит (особенно если вы должны идти по массиву и нулю каждый элемент) ?
По-видимому, это не проблема с более сложными элементами данных, такими как контейнеры STL, потому что their destructors clear their data, а также pointers should not be cleared для целей отладки.
Вы недопонимаете тот первый вопрос, на который вы ссылаетесь. 'std :: vector' clear просто удаляет содержащиеся в нем элементы, он не« очищает », а затем в том смысле, что вы здесь. – Mat
В коде есть неопределенное поведение. Обнуление вещей в деструкторе не изменит этого. – juanchopanza
@juanchopanza Я понимаю, что код надуман. Я просто хотел привести пример, который показывает, что 'delete' только перераспределяет память, а не фактически« очищает »то, что там хранилось. –