有没有办法在析构函数中删除一个没有用new操作符赋值的指针?如果是这样,我应该在析构函数中删除它吗?
Is there a way to delete a pointer that has not been assigned with new operator in the destructor? If so, should I delete it in the destructor?
例如,
class Test{
private:
int* foo;
public:
Test(int* foo){this->foo = foo;}
}
在这种情况下,有什么方法可以在析构函数中删除 foo 吗?我是否必须在析构函数中删除 foo 或至少将其设置为 nullptr?
当然,你可以。它是合法的语法。根据程序的其余部分,它 可能 做你想做的,或者它可能是双重删除(删除同一个指针两次),这会破坏堆并最终导致碰撞。 (调试编译器可能会捕捉到这一点。)
C++ 标准模板库给我们 shared_ptr
和 unique_ptr
的原因之一是手动内存管理 hard。这并非不可能;人们这样做(或尝试)很多年了。但它也是许多运行时灾难的根源,要么是双重删除(也称为从旧的 malloc/free 例程中过早释放),要么相反,内存泄漏。自动内存管理是 Java 作为 C/C++ 类似语言的卖点之一,没有内存错误风险。后来 C# 向用户提出了同样的建议。
我建议使用 STL 并考虑 foo 的所有权语义。也许测试 class 应该拥有它;也许它应该分享它;也许它真的应该有一个弱参考。无法从程序片段中分辨出来。我只能说你应该回顾一下 C++ 中内存管理的现代思想并采用它们。
删除这个指针在语义上是合法的,但我想这不是你问的原因。
你在问这是否是个好主意。
在 C++ 中处理原始指针通常是一种不好的做法,这个问题就是原因之一。
为了使 class 的使用对任何阅读它的人来说都是显而易见的,如果你不这样做,我会使用 std::unique_ptr
if you intend to take ownership of the pointer and either a reference or std::shared_ptr
。
如果指针已被删除,智能指针对象会为您跟踪,并且它们会在其析构函数中自动删除指针。
如果你绝对必须有一个原始指针并且你需要检查它是否被删除,恐怕你唯一的选择是在删除后立即将 nullptr
分配给它。
例如,
class Test{
private:
int* foo;
public:
Test(int* foo){this->foo = foo;}
}
在这种情况下,有什么方法可以在析构函数中删除 foo 吗?我是否必须在析构函数中删除 foo 或至少将其设置为 nullptr?
当然,你可以。它是合法的语法。根据程序的其余部分,它 可能 做你想做的,或者它可能是双重删除(删除同一个指针两次),这会破坏堆并最终导致碰撞。 (调试编译器可能会捕捉到这一点。)
C++ 标准模板库给我们 shared_ptr
和 unique_ptr
的原因之一是手动内存管理 hard。这并非不可能;人们这样做(或尝试)很多年了。但它也是许多运行时灾难的根源,要么是双重删除(也称为从旧的 malloc/free 例程中过早释放),要么相反,内存泄漏。自动内存管理是 Java 作为 C/C++ 类似语言的卖点之一,没有内存错误风险。后来 C# 向用户提出了同样的建议。
我建议使用 STL 并考虑 foo 的所有权语义。也许测试 class 应该拥有它;也许它应该分享它;也许它真的应该有一个弱参考。无法从程序片段中分辨出来。我只能说你应该回顾一下 C++ 中内存管理的现代思想并采用它们。
删除这个指针在语义上是合法的,但我想这不是你问的原因。 你在问这是否是个好主意。
在 C++ 中处理原始指针通常是一种不好的做法,这个问题就是原因之一。
为了使 class 的使用对任何阅读它的人来说都是显而易见的,如果你不这样做,我会使用 std::unique_ptr
if you intend to take ownership of the pointer and either a reference or std::shared_ptr
。
如果指针已被删除,智能指针对象会为您跟踪,并且它们会在其析构函数中自动删除指针。
如果你绝对必须有一个原始指针并且你需要检查它是否被删除,恐怕你唯一的选择是在删除后立即将 nullptr
分配给它。