C++ 理解析构函数

C++ 理解析构函数,c++,C++,我有以下简单的类Foo: class Foo { }; 我尝试运行以下单元测试代码: Foo* foo = new Foo; Assert::IsNotNull(foo); delete foo; Assert::IsNull(foo); //why is it not null?? I deleted it. 当我删除foo时,这个对象的内存被释放,因此foo应该指向nullptr 为什么删除后foo不为空?删除不会更改指针的值,只会释放指针指向的内存。删除后,相应的指针无效。(删

我有以下简单的类
Foo

class Foo {

};
我尝试运行以下单元测试代码:

Foo* foo = new Foo;

Assert::IsNotNull(foo);

delete foo;

Assert::IsNull(foo); //why is it not null?? I deleted it.
当我删除
foo
时,这个对象的内存被释放,因此
foo
应该指向
nullptr


为什么删除后
foo
不为空?

删除不会更改指针的值,只会释放指针指向的内存。删除后,相应的指针无效。(删除也将调用析构函数)


删除有效指针必须始终成功,否则这是未定义的行为。

删除不会更改指针的值,而只会释放指针指向的内存。删除后,相应的指针无效。(删除也将调用析构函数)


删除有效指针必须始终成功,否则这是未定义的行为。

如果我在
Foo
析构函数中删除其他对象,我如何才能单元测试它们是否确实被删除而没有任何内存泄漏?
delete
不仅释放内存;它还运行对象的析构函数(虽然在本例中没有要运行的析构函数)。如何断言
foo
的内存已释放?@Humberd为什么要这样做?这将测试编译器,而不是您的代码。你是否也断言在
inti=42
i==42
有效吗?@Humberd如果您真的需要断言它,为什么不按照前面的建议使用智能指针呢?在你的情况下,你不能检查它。您需要依赖于如何构造代码。您可以运行valgrind之类的工具,但这些工具当然只会在运行时发现问题。(也就是说,如果你注意的话,你可以使用原始指针,只要确定责任在哪里)如果我在
Foo
析构函数中删除其他对象,我怎么能单元测试它们是否确实被删除而没有任何内存泄漏?
delete
不仅释放内存;它还运行对象的析构函数(虽然在本例中没有要运行的析构函数)。如何断言
foo
的内存已释放?@Humberd为什么要这样做?这将测试编译器,而不是您的代码。你是否也断言在
inti=42
i==42
有效吗?@Humberd如果您真的需要断言它,为什么不按照前面的建议使用智能指针呢?在你的情况下,你不能检查它。您需要依赖于如何构造代码。您可以运行valgrind之类的工具,但这些工具当然只会在运行时发现问题。(也就是说,如果你注意的话,你可以使用原始指针,只要确定责任在哪里)使用智能指针避免无意的内存泄漏。使用智能指针避免无意的内存泄漏。