【问题标题】:Do I need to delete pointer which pointing pointer in heap? [duplicate]我需要删除指向堆中的指针吗? [复制]
【发布时间】:2020-02-24 17:52:54
【问题描述】:
    Class example
{
};

int main()
{
  Example* pointer1 = new example();
  Example* pointer2;
  pointer2 = pointer1;
  delete pointer1;
}

我应该删除指针 2 吗?我认为它在堆栈中,我不需要删除。

【问题讨论】:

  • 不,它指向的内存已经被删除指针1释放了
  • 将它分配给 null_ptr 可能不会有什么坏处,因为如果在删除后执行任何其他操作,它将是一个悬挂指针。
  • 如果你new它,你应该delete它。一次。如果您传递所有权,您将传递删除它的责任,而传递者正在放弃该责任。 (但最好使用std::unique_ptrstd::shared_ptr 在代码中更明确地表达所有权。)
  • 不,pointer2 将是一个悬空指针。您需要自己将其设置为nullptr(如果这对您的代码很重要)。
  • 您不删除指针 - 您使用指针删除对象。

标签: c++ dynamic-memory-allocation delete-operator


【解决方案1】:

简短回答:不。

pointer1pointer2 都是存在于栈中的指针。 new Example 在堆上分配一个Example 类型的新对象,其内存地址存储在pointer1 中。当您执行delete pointer1 时,您正在释放堆上分配的内存。由于pointer1pointer2 都在delete 调用点引用相同的内存位置,所以它不需要也是deleted,事实上,这将是未定义的行为,并且可能导致堆损坏或只是您的程序崩溃。

最后,pointer1pointer2 仍然指向同一个内存块,实际上nullptr 都不是。

【讨论】:

  • 这是一种冗长的说法,即每次对new 的调用都必须与对delete 的一次调用完全匹配。还要注意堆和堆栈这些术语,这些术语严格来说不是 C++ 的一部分;您应该使用术语自动存储期限和动态存储期限。当您进入更复杂的细节堆和堆栈时,我提出它的原因变得令人困惑,而存储持续时间继续起作用。我想在这种情况下它可以工作,但要小心。
【解决方案2】:

删除指针是告诉操作系统程序不再需要该指针所在位置的内存。请记住,指针只是一个指向 RAM 中的整数。通过执行pointer2 = pointer1,您只是在复制整数,而不会移动任何内存。因此,通过删除第一个指针,因为第二个指针指向同一个位置,所以不需要删除。

【讨论】:

  • 内存中的所有内容都是一个“整数”,我宁愿更仔细地提及事物。在您的示例中,我建议您将“整数”替换为“地址”。
  • @MartinYork 我知道这一点,但地址只是一个整数,它指向内存中的某个位置,初学者更容易理解。抱歉,如果我没有使用最好的术语来描述指针,但我认为 Kaepxer 理解比使用最正确的术语更重要。
  • 你实际上是在一个术语中做出一大堆假设。但它是你的答案。在我看来,它弊大于利,所以-1。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-08
  • 1970-01-01
  • 2012-08-02
  • 2013-08-08
相关资源
最近更新 更多