【发布时间】:2020-01-07 10:27:22
【问题描述】:
我有一个像这样的 A 类:
class A
{
int a;
}
而且,我还有继承了 A 类的 B 类:
class B : public A
{
int b;
public:
static A** ReturnAPtrArray(int size);
}
然后,我在 B 类中创建具有 A 类指针的 Array。
A** B::ReturnAPtrArray(int size)
{
A** array = new A*[size];
for(int i = 0; i< size; i++)
{
array[i] = new A();
}
return array;
}
在 main func 中,我调用了 class B 的 ReturnAPtrArray() func。
void main(void)
{
int size = 100;
A** aptrArray = B::ReturnAPtrArray(size);
--------Do Something
delete[] aptrArray;
}
这个主函数会导致内存泄漏。所以我删除了这样的每个指针:
void main(void)
{
int size = 100;
A** aptrArray = B::ReturnAPtrArray(size);
--------Do Something
for(int i = 0; i< size; i++)
{
delete aptrArray[i];
}
delete[] aptrArray;
}
修改main func后,内存泄漏消失了。
如果我想释放内存,我应该删除指针数组中的所有指针吗?
还有其他选择吗?
【问题讨论】:
-
给A类添加一个虚析构函数,见stackoverflow.com/questions/461203/…
-
每个
new一个delete,每个delete[]一个new[]。 -
std::vector<std::unique_ptr<A>>避免手动内存管理。 -
是的。
new表达式的每次使用都必须与相应的delete表达式匹配。分配函数使用new[]正好size + 1次。要释放,必须在所有这些size + 1分配上使用delete [](即,new []表达式给出的每个指针必须显式地提供给delete []表达式一次)。 -
所以你使用指针是因为你可能有指向派生类的指针?那么
class A必须有虚拟析构函数,否则delete aptrArray[i];可能有未定义的行为。
标签: c++