【问题标题】:C++ allocation of vector which contains newed pointers包含新指针的向量的 C++ 分配
【发布时间】:2023-04-10 09:42:02
【问题描述】:

当使用vector保存指向新分配对象的指针时,比如

vector<int*> intP;
for(int i = 0; i < N; ++i){
   intP.push_back(new int(i));
}

我知道我们必须释放每个int* 自己指向的所有内容,通常在&lt;algorithm&gt; 中使用for_each。我还知道,当向量的大小增加到其容量时,它将通过分配两倍大小的新空间、将旧空间中的所有内容复制到新空间以及销毁旧空间中的所有内容来重新分配更多空间。但这不会导致内存泄漏,因为没有人删除旧int*指向的内容吗?

【问题讨论】:

  • 对,没有泄漏。您可能有兴趣知道您可以使用std::unique_ptr,这样您就不必在完成后手动删除所有内容。
  • 指针被复制,因此新的int*s 将指向相同的对象。在您真正想从向量中删除它们之前,无需删除它们。话虽如此,你永远不想这样做。你想要一个std::vector&lt;std::unique_ptr&lt;int&gt;&gt; 或一个普通的std::vector&lt;int&gt;
  • 手动内存管理是so 90s C++。现在你应该使用智能指针。
  • @super 我刚刚意识到复制正在做需要做的事情..谢谢!

标签: c++ vector stl


【解决方案1】:

让我们首先更好地定义什么是“泄漏”。当您动态分配的内存浮动在您无法再访问时,就会发生内存泄漏。

这意味着您无法释放它,甚至无法知道它在哪里!这可能是在您调用 delete 或其他一些事情之前指针超出范围的结果。

在您的情况下,std::vector 确实会破坏指向动态内存的指针数组,但在此之前,它会复制所有指针。因此,由于您仍然能够访问您的动态内存,因此没有泄漏!


您可能还对std::unique_ptr 感兴趣,它将为您进行内存管理,因此您根本不必担心泄漏!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-28
    • 2022-01-06
    • 2018-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-11
    相关资源
    最近更新 更多