1

我有A级

class A
{
  A();
  ~A();

  DoSomething();
}

然后我声明一个对象和一个指向分配对象的指针

A Obj;
A* pObj = &Obj;

我发现在 DoSomething() 内部我将 pObj 设置为 NULL

A::DoSomething()
{ 
    pObj=NULL;
}

所以在一个方法中,我正在杀死指向自己的指针......这并没有崩溃......

注意:我注意到在调试器中这是(Obj const)。

我很难理解为什么这不会导致任何形式的腐败。我认为这不安全,但我无法真正理解它的后果。

干杯

4

4 回答 4

6

所以在一个方法中,我正在杀死指向自己的指针......这并没有崩溃......

它绝对没有理由崩溃。你可以有很多指向一个对象的指针。他们将其中一个或多个重置为 NULL 的事实并不自动意味着应该发生任何不好的事情。

需要注意的两类问题是:

  1. 如果您在将指针设置为 NULL 后尝试取消引用,则代码的行为将是未定义的(很可能会崩溃)。
  2. 如果对象是在堆上分配的(你的不是)并且你在没有调用的情况下重置了所有指向它的指针delete,你就会泄漏内存。
于 2013-01-08T11:17:59.363 回答
2

将 pObj 视为一张写有地址的纸。如果你烧掉这张纸,它“指向”的建筑物将保持原样。删除对象的所有引用和指针不会自动释放它。

顺便说一句,您甚至可以delete this;在类的方法内部调用它也可以工作,除非您在删除后尝试访问该实例的成员。但是,仅真正需要时才应使用此解决方案。

但请记住,如果它是指向实例的唯一指针,您将无法再访问它,这将导致内存泄漏。

于 2013-01-08T11:24:01.600 回答
1

您的对象保持不变。只是改变了一些指向对象的指针。这不是问题。这是一个可视化:

+---------+
|   Obj   |  <-------- pObj
+---------+

现在你在里面所做A::DoSomething的就是从上图中删除箭头。Obj继续,好像什么都没发生。

于 2013-01-08T11:19:53.013 回答
0

它不会崩溃,因为从实例内部访问不是通过存储在变量中的指针发生的pObj,而是通过this关键字访问的内部隐式常量指针(不是this那个变量,它只是一个获取实例在内存中实际位置的指针的方法,但对于任何实际应用程序,它都表现为常量指针)。

因此,当您使用 NULL 覆盖变量pObj时,您的对象不会消失,并且对象内的所有内部引用仍然有效,因为它们不依赖于您定义的任何变量,而是由编译器解析为直接引用实例在内存中的位置。

于 2013-01-08T11:23:02.953 回答