【问题标题】:why C++ can't free memory and pointer simultaneously为什么 C++ 不能同时释放内存和指针
【发布时间】:2020-06-16 15:56:32
【问题描述】:

我了解到在 C++ 中(从 VSCode 0.26.3 下载)虽然内存已经被释放,但指向它的指针不会改变,这意味着它们不会为 NULL。

有什么方法可以让指针为NULL吗?

【问题讨论】:

  • 不,没有。
  • 使用智能指针。例如。 shared_ptrunique_ptr,取决于用例。指针将在那里进行内存管理,您可以同时进行这两项操作(例如,通过调用reset())。
  • 你的程序逻辑应该“知道”哪些指针持有有效的指针值,哪些没有。为此目的设置一个指向nullptr的指针。
  • 就个人而言,我完全避免使用原始指针——通过使用智能指针或标准容器。如果我必须使用原始指针,而不是在释放它指向的任何内容后将其设置为 NULL,我确保指针本身不再存在 - 例如,由于超出范围,或者(如果它包含在对象中)因为包含对象不再存在。如果您必须将指针设置为 NULL,这意味着您将指针本身保留的时间比需要的时间长。
  • @J.Doe nullptr 检查指针完全没问题。即使您想断言它们的有效性,它们仍然需要为 nullptr 才能可靠地工作。如果有的话,不将释放的指针清空的唯一原因是指针本身即将被销毁或重新分配。

标签: c++ pointers dma


【解决方案1】:

不,没有自动执行此操作的方法,重要的是要意识到手动将指针设置为nullptr 也不能解决一般问题。要了解原因,请考虑以下简化示例:

int* x = new int(5);
int* y = x;
delete x;
x = nullptr;
if (x) // attempt to check if x still points to an object
    std::cout << *x;
if (y) // attempt to check if y still points to an object
    std::cout << *y;  // !! UNDEFINED BEHAVIOR !!

在调用delete 之后,通常会看到指针被设置为nullptr。但是,假设yx 不在同一范围内,但其他对象拥有y,那么其他对象就无法“知道”y 不再是有效指针。

为了避免这个问题和其他问题smart pointers 已经被引入,应该避免使用原始指针。

【讨论】:

  • raw pointers should be avoided。应该避免拥有原始指针,但只要observer_ptr 不是标准的一部分,仍然有许多有效的地方可以使用原始指针。
  • @t.niese 我首先有“拥有原始指针”,但后来意识到我必须解释更多,因为在示例中 y 是问题,y 不是拥有指针.相反添加更多解释,我允许自己有些草率。在这种情况下,它可能应该是共享的弱指针,所以我认为排除原始指针并将它们留给“知情”读者是很好的
  • @t.niese 总的来说,我同意“不要使用原始指针”是不必要的(甚至是有害的)夸张,但另一方面,“避免使用原始指针”并不排除在某些情况下使用它们它们适合的地方(但不适合其他地方)
【解决方案2】:

如果您使用的是原始指针,那么每当您释放内存时,都会明确地将指针分配给 NULL。原始指针没有自动方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-06
    • 1970-01-01
    • 1970-01-01
    • 2017-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-28
    相关资源
    最近更新 更多