【问题标题】:Do I need to delete the pointer in the loop here? [duplicate]我需要在这里删除循环中的指针吗? [复制]
【发布时间】:2014-05-07 23:09:26
【问题描述】:

如果我有这样的事情:

for(MyClass* m : a_container){
    //
    //Do something with m
    //
    //delete m;    ?
}

//delete m;    ?

我是否需要在每次循环迭代中删除m,还是因为重复使用相同的指针而只在最后删除?

注意:我知道我应该使用 shared_ptrs,但这是出于特定原因。

【问题讨论】:

  • 关于shared_ptrs,我认为有太多人会自动选择shared_ptr,即使共享语义是不必要的。 shared_ptr 确实比 unique_ptr 有更多开销,例如,由于同步等原因。请确保在使用 shared_ptr 之前确实需要共享语义。如果没有,请使用unique_ptr
  • 这个问题很可笑——没有办法回答它(-1)
  • @DieterLücking 下面的人设法回答得很好

标签: c++ pointers


【解决方案1】:

问题不是m 是否应该被删除,而是它指向 应该是什么。如果您正在迭代一个容器,其元素是指针并且需要在该时间点删除,您可以使用delete m;m本身不需要删除,因为它是在栈上创建的,在创建实际指针时没有使用new,所以不需要调用delete

【讨论】:

  • 是的,我不想从容器中删除实际元素,我以为我每次都在创建一个悬空指针——但你说这些指针在堆栈上,我不需要做什么?
  • (因为没有创建新对象,只是一个指向现有对象的指针(在堆栈上))
  • @user997112 当所有迭代完成后,m 将从堆栈中销毁。根本没有悬空指针。那就是它指向的元素超出范围,并且指向一个空地址。
  • 那您提供一些(非)模糊性并启发我们如何?
  • @DieterLücking 不确定你的意思。你能解释一下吗?
猜你喜欢
  • 2020-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-01
  • 2011-05-18
  • 1970-01-01
  • 2020-09-30
相关资源
最近更新 更多