有没有办法删除析构函数中未使用 new 运算符赋值的指针?如果是这样,我应该在析构函数中删除它吗?

One*_*ble 0 c++ pointers memory-leaks ownership-semantics

例如,

class Test{
private:
   int* foo;
public:
   Test(int* foo){this->foo = foo;}
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,有什么办法可以在析构函数中删除 foo 吗?我是否必须在析构函数中删除 foo 或者至少将其设置为 nullptr?

And*_*rus 5

你当然可以。这是合法的语法。根据程序的其余部分,它可能会执行您想要的操作,也可能是双重删除(删除同一指针两次),这会损坏堆并导致最终崩溃。(调试编译器可能会发现这一点。)

\n

C++ 标准模板库给我们带来的原因之一shared_ptrunique_ptr手动内存管理很困难。这并非不可能;人们这样做(或试图这样做)很多很多年了。但它也是许多运行时灾难的根源,要么是双重删除(也称为从旧的 malloc/free 例程中过早释放),要么是相反的内存泄漏。自动内存管理是 Java\xe2\x80\x99 作为 C/C++ 类似语言且没有内存错误风险的卖点之一。后来 C# 也向用户做了同样的宣传。

\n

我建议使用 STL 并考虑 foo.txt 的所有权语义。也许测试类应该拥有它;也许它应该分享它;也许它确实应该有一个弱引用。无法从程序片段中看出。我只能说你应该回顾一下 C++ 中内存管理的现代思想并采用它们。

\n

  • *“或者它可能是双重删除”* - 或者它可能是尝试删除非动态变量(自动或静态存储持续时间),这也很糟糕。 (4认同)