2012-03-02 25 views
0

如何正确删除它?内存泄漏,来源:float ** binsRowPtrs =新的浮动* [_ nbins];

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

这些项目不是用新的动态创建的。

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

'刚删除binRowPtrs?'是的,差不多。如果任何指针也是动态分配的,则需要释放这些指针才能完成。 – Mysticial 2012-03-02 03:55:16

回答

1

规则是:分别为newnew[]您使用

呼叫许多deletedelete[]和完全相同的地址。

因此,如果您只需在binRowPtrs上调用new,那么您只需致电delete binRowPtrs即可。

然而,在你的代码的一部分,你并没有告诉我们,如果你通过new每个数组元素的使用动态分配的,那么你通过数组需要循环,并在每个元素的调用delete好。

需要注意的是理想,
在C++中应该使用动态分配的,只有当你无法避免他们&
如果等所有你必须从不使用原始指针,始终使用RAII通过smart pointers避免明确内存管理(你已经注意到在你的情况下这样做的危险)。

+0

这是我在网上找到的一些示例代码,经过3个小时的调试后,我终于找到了新的并且没有删除。只是不确定float * []意味着什么。无论如何,我认为它适用于使用新的float []为小数组的临时值。我发现它easyer键入然后使用std :: vector – 2012-03-02 04:10:01

+0

@ s093294:与您的Q编辑,是的只是'删除binRowPtrs;'应该没问题。至于易用性,想想现在面临的问题,如果使用智能指针,所有这些都不会存在。您应该选择使用RAII,因为使用它时很难出错,而不是手动内存管理可能会非常容易出错并且有时会令人困惑。 – 2012-03-02 04:12:45

+0

@ s093294是的,如果你喜欢打字的正确性,'new float []'很好。但如果你重视正确性,那就不好了。 – 2012-03-02 04:22:44

2

如何正确删除[?]

正常吗?您使用RAII并让其他人为您处理删除操作。取决于你想要做什么,你可能想要使用:

  • std::vector<std::vector<float>>:浮点数组数组;
  • std::vector<float*>:浮点数的非拥有指针数组(即其他东西处理正确的分配和释放);
  • 或者可能只是std::vector<float>:浮点数组。
0

这将清除这些指针:

delete [] binsRowPtrs; 

但你和箱存储的实际数据将不会被改变。