【问题标题】:Memory Leak, source: float** binsRowPtrs = new float *[_nbins];内存泄漏,来源:float** binsRowPtrs = new float *[_nbins];
【发布时间】:2012-03-02 03:53:15
【问题描述】:

如何正确删除?

float** binsRowPtrs = new float *[_nbins];

项目不是用 new 动态创建的。

float** binsRowPtrs = new float *[_nbins];
for (int i = 0; i < _nbins ;i++)
{
    binsRowPtrs[i] = (float*) (bins[i].row(y).data);
}

【问题讨论】:

  • just delete binRowPtrs ? 是的,差不多。如果任何指针也被动态分配,那么如果它们完成了,您也需要释放它们。

标签: c++ memory-leaks delete-operator


【解决方案1】:

如何正确删除这个[?]

正确吗?您使用 RAII 并让其他东西为您处理删除。根据您要执行的操作,您可能需要使用:

  • std::vector&lt;std::vector&lt;float&gt;&gt;:浮点数数组;
  • std::vector&lt;float*&gt;:一个指向浮点数的非拥有指针数组(即其他东西处理正确的分配和释放);
  • 或者只是std::vector&lt;float&gt;:一个浮点数组。

【讨论】:

    【解决方案2】:

    规则是:

    在完全相同的地址上分别调用与newnew[] 一样多的deletedelete[]

    因此,如果您刚刚在 binRowPtrs 上拨打了 new,那么您只需拨打 delete binRowPtrs

    但是,在您没有向我们展示的代码部分中,如果您通过 new 对每个数组元素使用动态分配,那么您需要遍历数组并在每个数组元素上调用 delete元素也是如此。

    请注意,理想情况下,
    在 C++ 中,只有在无法避免动态分配时才应该使用它们 &
    如果你必须这样做,永远不要使用原始指针,总是使用 RAIIsmart pointers 以避免显式内存管理(你已经注意到这样做的危险你的情况)。

    【讨论】:

    • 这是我在网上找到的一些示例代码,经过3个小时的调试,我终于找到了新的并且没有删除。只是不确定 float *[] 是什么意思。无论如何,我认为将 new float[] 用于临时值的小数组是很好的。我发现打字比使用 std::vector 更容易
    • @s093294:通过 Q 编辑,是的,delete binRowPtrs; 应该没问题。至于易用性,想想你现在面临的问题,如果你使用智能指针,这一切都不存在。你应该选择使用RAII,因为它在使用时很难出错,而不是手动内存管理有时可能非常容易出错和混淆。
    • @s093294 是的,new float[] 很好,如果您更喜欢易于打字而不是正确性。但如果你重视正确性,那就不好了。
    • 谢谢。我会查看您提供的链接并找到另一个解决方案。
    【解决方案3】:

    这将清除那些指针:

    delete [] binsRowPtrs;
    

    但不会触及您使用 bin 存储的实际数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-15
      • 1970-01-01
      • 2013-05-25
      • 2021-05-08
      相关资源
      最近更新 更多