[英]How to delete memory of a pointer to pointer in C++
使用 Valgrind,我发现在以下函数中删除内存时出现问题:
Obj1 Obj1::operator*(const Obj1& param) const {
int n = param.GetSize(2);
Obj2** s = new Obj2*[n];
for( int i = 0; i < n; ++i) {
s[i] = new Obj2(*this*param.GetColumn(i+1));
}
Obj1 res = foo(s,n);
for(int i=n-1;i>-1;i--) {
s[i]->~Obj2();
}
delete[] s;
return res;
Valgrind 告诉我泄漏来自线路
s[i] = new Obj2(*this*param.GetColumn(i+1));
我不太确定问题是否出在我尝试释放内存时。 谁能告诉我如何解决这个问题?
这里:
s[i] = new Obj2(*this*param.GetColumn(i+1));
您创建一个动态对象并分配s[i]
指向它。
要删除它,请执行以下操作:
delete s[i];
除非您这样做,否则分配将泄漏。
您必须在循环中为每个i
重复此操作,就像您重复分配一样。 您当然必须在删除s
之前执行此操作。
s[i]->~Obj2();
不要那样做。 在这里调用析构函数是不合适的。 delete
将调用析构函数。
PS 不要使用原始拥有指针。 改用容器或智能指针。 std::vector
是动态数组的标准容器。
PPS 你应该避免不必要的动态分配。 您的示例没有说明任何需要动态分配指向的对象。 因此,在这种情况下,您可能应该使用std::vector<Obj2>
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.