如果引用应该保留,不会在析构函数中删除指针会导致内存泄漏吗?

Will not deleting a pointer in destructor cause memory leak if reference should stick around?

我不知道如何表达我的问题更简单,但我有这个:

class Curve;

class Node {
    Curve *curve;
public:
    Node(Curve *curve);
    ~Node();
}

class Curve {
    LinkedList<Node> nodes;
public:
    Curve(); ~Curve();
}

在析构函数中不删除指向曲线的指针可以吗~Node?即会不会造成内存泄漏?还是我应该删除它?如果我删除它,它会破坏曲线吗?

编辑:曲线最终会被删除。

编辑 2:实施。

假设我实现了以下代码:

int main() {
    Curve *curve = new Curve();
    Node *node = new Node(curve);
    delete node; delete curve;
    return 0;
}

我还需要在节点的析构函数中调用 delete curve 吗?

这与内存碎片或内存泄漏无关。

这是关于:

  • 所有权:
    • 谁拥有资源? main(与 Node 共享)或 Nodemain 向其转让所有权)?您需要通过使用智能指针或通过文档以某种方式明确这一点。
  • 正确性:
    • 只有 一个 这些东西(拥有所有权的东西)应该删除。你不能删除一个东西两次。

正如其他答案中提到的,这是关于所有权的。在您的特定示例中,可以不删除节点 class 的析构函数中的 Curve*,因为您在 main 函数中管理 Curve 实例的生命周期。在实际代码中,管理原始指针可能非常困难,并会导致严重的错误。由于您将问题标记为 C++,因此您应该使用标准库的智能指针并将 Curve* 替换为 std::shared_ptr。 如果您改变主意并让 Node 单独负责管理 Curve 实例,最好使用 std::unique_ptr 而不是原始指针。