【问题标题】:Is it a good way to do that to reset a pointer to null in C++?在 C++ 中将指针重置为 null 是一种好方法吗?
【发布时间】:2023-01-24 22:10:49
【问题描述】:

我想知道这是否是将指针重置为 null 的好方法。我想是的,但我想确定。 我使用基本的 C++(不是 C++ 11;C++ 14,...)。

例子:

MyClass * myClass = new MyClass();

delete myClass;
myClass = NULL;

我以为删除重置了指针,但实际上没有。 如果指针在“新建”之后的值为 0xb861708,那么在“删除”之后该值始终为 0xb861708。 删除释放内存但不重置指针。因此,操作系统可以使用释放的内存,但指针仍指向内存区域。 如果删除后我们这样做myClass->SomeFunction(),它使程序崩溃(SIGSEGV)或使操作系统崩溃。

这就是为什么我曾经在删除后重置指针但想知道这是否是正确的方法。

非常感谢。

乔斯林

删除后以正确的方式重置指针。

【问题讨论】:

  • 使用 std::unique_ptr 而不是低级内存原语,您就不必费心了。
  • 是的,这没关系。在 C++11 或更新版本中将使用 nullptr 而不是 NULL。你为什么要在 2023 年限制自己使用 C++98?
  • 使用 myClass = nullptr; 而不是 myClass = NULL;。我不确定你的意思基础C++. C++ 标准目前是 C++20,很快就会是 C++23。
  • 曾经有一段时间人们在做类似#define SAFE_DELETE(x) delete x; x = NULL;的事情。以前不喜欢,现在更不喜欢。
  • 如果在删除之后我们执行 myClass->SomeFunction()-- 那么那是你程序中的错误。弄清楚为什么您的程序会使用无效的对象指针调用函数的路径可能更明智。如果您的代码在整个代码库中变成了很多行 if (ptr == nullptr) do something;,那么这意味着某处的设计和/或逻辑存在缺陷。

标签: c++ c++11


【解决方案1】:

freeing 之后设置指向 NULL 的指针是惯用的在 C因为 C 没有类似于 C++ 中的智能指针的东西。

如果您在现代 C++ 中使用 newdelete 进行手动内存管理,那么在释放它们之后将您的指针设置为 nullptr(而不是 NULL)是一个很好的做法,但是手动内存管理已经是不好的做法在现代 C++ 中。使用为您处理此问题的智能指针类型。

【讨论】:

    猜你喜欢
    • 2011-08-30
    • 2013-06-12
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-01
    相关资源
    最近更新 更多