0

例如,

class Test{
private:
   int* foo;
public:
   Test(int* foo){this->foo = foo;}
}

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

4

2 回答 2

5

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

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

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

于 2021-12-04T07:19:33.520 回答
1

删除这个指针在语义上是合法的,但我想这不是你问的原因。你问这是不是一个好主意。

在 C++ 中处理原始指针通常是一种不好的做法,这个问题就是其中的一个例子。为了让任何阅读该类的人都能清楚地使用该类,std::unique_ptr如果您打算获得指针的所有权以及引用或std::shared_ptr不拥有,我将使用该类。

如果指针已被删除,智能指针对象将为您跟踪,它们将在其析构函数中自动删除指针。

如果您绝对必须有一个原始指针并且您需要检查它是否被删除,恐怕您唯一的选择是nullptr在删除后立即分配给它。

于 2021-12-04T07:25:57.147 回答