在使用C++中的内置指针时,我遇到了一个问题。当我的程序终止时,所有的类析构函数都会被调用。我有一个数据类,一个队列类和另一个结合使用队列的数据类,如下所示(注意动态编码):

class Data {
  int x;
}

class Queue {
  class Node {
    Data* x;
  }
  Node* head;
}

class C1 {
  Queue q;
}

class C1Queue{
  class Node {
    C1* c;
  }
  Node* head;
}

我还有另一个队列q2,它不驻留在对象中。我从文件加载两个队列,所以我大致讲了一些(假设cQueue是C1Queue):
Data *d = new Data(0);
q2->pushBack(d);
C1 c = new C1();
cQueue->pushBack(c->pushBack(d));

如您所见,我既有一个队列(q2),它保存着指向每个数据的指针,又有一个对象,队列中的指针是指向与q2相同的数据。
现在,当我的程序终止时,我希望所有数据都被释放。但是,当要释放对象时,首先要释放q2,而要释放C1对象时,它们将释放其队列,然后删除与刚刚删除的q2相同的数据。或另一种情况是先释放对象(我不确定会发生哪种排序),然后释放q2并运行到已删除的内存中。

因此,问题在于内存空间被删除了两次,这是不好的。删除内存后,会将其释放给其他程序使用,因此再次删除该内存空间将导致段错误。

也许我在这里缺少了一些东西,但是如果没有特殊类型的指针(我不能使用特殊类型的指针),我无法弄清楚该如何做。

我能想到的唯一方法是阻止C1对象分配其队列,而是分配其自身的其余部分,但我不知道该怎么做。如果有人可以帮助我,我将不胜感激。

最佳答案

由于您(显然)被禁止使用std::shared_ptr之类的精美信息,因此您可以尝试以下三种补救方法之一:

  • 手动计票。强制每次将Data推送到队列上以使其refcount增加,并在清理Queue时减少refcount。当引用计数为零时,使用delete this(但请确保始终在堆上分配Data!)
  • 指定一个对象以“拥有” Data元素。只有该对象才能销毁Data(您甚至可以使用私有(private)析构函数和friend类来强制执行此操作)。您可能需要多个。 (如果您引用此代理,这将成为穷人的std::shared_ptr)。
  • 使您的Data可复制,并使用全新的对象进行所有操作。如果不需要同步的少量数据(例如,包含两个整数的Point2D类),则此方法有效。
  • 09-20 16:57