内存泄漏,来源:float ** binsRowPtrs = new float * [_ nbins];

时间:2012-03-02 03:53:15

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

如何正确删除?

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);
}

3 个答案:

答案 0 :(得分:2)

  

如何正确删除[?]

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

  • std::vector<std::vector<float>>:一系列花车阵列;
  • std::vector<float*>:一系列浮动的非拥有指针(即其他东西处理正确的分配和释放);
  • 或者只是std::vector<float>:一系列花车。

答案 1 :(得分:1)

规则是:

分别与您使用的deletedelete[]以及完全相同的地址分别拨打newnew[]

因此,如果您刚刚new拨打binRowPtrs,则只需拨打delete binRowPtrs即可。

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

注意理想情况下,
在C ++中,只有在无法避免动态分配时才应使用动态分配 如果你必须这样做,永远不要使用原始指针,请始终使用 RAII 通过 smart pointers 来避免显式内存管理(你已经注意到了危险)在你的情况下这样做。)

答案 2 :(得分:0)

这将清除这些指示:

delete [] binsRowPtrs;

但是不会触及您使用垃圾箱存储的实际数据。