0

如果您执行以下操作:

ClassType *foo = new ClassType();
ClassType *moo = foo;
delete foo;

然后继续前进,是否还有悬空指针?我认为不,因为您只声明了一个“新”,然后将其删除,但我想确定...

谢谢

4

4 回答 4

3

您创建了一个对象并将其删除。您的两个指针仍指向该对象先前占用的内存地址,但该对象已被删除,通常这是悬空指针的公认定义 - 指向不再包含活动对象的某些内存。

没有内存泄漏,除非您尝试通过任一指针访问现在已删除的对象,否则您的程序不会导致问题。

使用 std::shared_ptr 或 std::unique_ptr 之类的东西可以帮助您以更安全的方式管理内存。

于 2012-09-07T07:11:30.443 回答
2

在 C++ 中,delete运算符调用给定参数的析构函数,并将分配的内存new返回给堆。时期。它什么也不做,这意味着您的指针指向堆上的某个位置,只是指向刚刚被取消分配的内存位置。所以那些指针变量仍然包含它之前指向的地址。这称为“悬空指针”。现在,如果您将 -moo和分配fooNULLafter delete,您将能够轻松识别您的指针是否指向有效位置或 NULL。

于 2012-09-07T08:20:58.517 回答
1

如果你的意思是悬空指针,是的,指针moofoo现在无效,因为它指向已经被删除的东西。

于 2012-09-07T07:03:51.493 回答
-1

foomoo指向同一个动态对象,使用以下命令创建:

ClassType *foo = new ClassType();

因此,如果您删除foo , moo也会被“删除”,或者它变成一个空指针。

于 2012-09-07T07:11:16.223 回答