如果引用应该保留,不会在析构函数中删除指针会导致内存泄漏吗?
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
共享)或 Node
(main
向其转让所有权)?您需要通过使用智能指针或通过文档以某种方式明确这一点。
- 正确性:
- 只有 一个 这些东西(拥有所有权的东西)应该删除。你不能删除一个东西两次。
正如其他答案中提到的,这是关于所有权的。在您的特定示例中,可以不删除节点 class 的析构函数中的 Curve*,因为您在 main 函数中管理 Curve 实例的生命周期。在实际代码中,管理原始指针可能非常困难,并会导致严重的错误。由于您将问题标记为 C++,因此您应该使用标准库的智能指针并将 Curve* 替换为 std::shared_ptr。
如果您改变主意并让 Node 单独负责管理 Curve 实例,最好使用 std::unique_ptr 而不是原始指针。
我不知道如何表达我的问题更简单,但我有这个:
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
共享)或Node
(main
向其转让所有权)?您需要通过使用智能指针或通过文档以某种方式明确这一点。
- 谁拥有资源?
- 正确性:
- 只有 一个 这些东西(拥有所有权的东西)应该删除。你不能删除一个东西两次。
正如其他答案中提到的,这是关于所有权的。在您的特定示例中,可以不删除节点 class 的析构函数中的 Curve*,因为您在 main 函数中管理 Curve 实例的生命周期。在实际代码中,管理原始指针可能非常困难,并会导致严重的错误。由于您将问题标记为 C++,因此您应该使用标准库的智能指针并将 Curve* 替换为 std::shared_ptr。 如果您改变主意并让 Node 单独负责管理 Curve 实例,最好使用 std::unique_ptr 而不是原始指针。