重新分配指针数组的一部分的安全方法

时间:2017-06-01 15:17:50

标签: c++ arrays pointers memory-leaks

我有一个代码,我在其中设置一个指向类对象的指针数组。像这样的东西

FE **dg = new FE*[ne];
for (int i = 0; i < numEle; i++)
{
    dg[i] = new FE(p, pt_type);
}

现在我要做的是在其他地方重新分配一些指向具有不同参数的新对象的指针。

dg[1] = new FE(q, pt_type);

这显然是有问题的,因为需要删除dg [1]指向的旧对象。当我做的时候

delete dg[1];
dg[1] = new FE(q, pt_type);

我遇到了段错误。当我不这样做时,代码会运行,但内存泄漏。

1 个答案:

答案 0 :(得分:0)

delete dg[1];
dg[1] = new FE(q, pt_type);

如果此程序出现段错误,则很可能意味着dg[1]或其中一个副本可能先前已被其他一些代码删除。其他可能性:它实际上是FE的构造函数,即segfaults。 dg或其中一个副本已被删除。 ne为0,因此dg[1]超出范围。

解决方案是删除每个指针一次,不多也不少。实现这一目标的典型方法是使用RAII容器。如果是单独的对象,可以使用智能指针,对于数组,可以使用std::vector。根据您使用对象的方式,您可能希望对所有动态对象使用std::unique_ptrstd::shared_ptr

一个例子:

std::vector<std::unique_ptr<FE>> dg(ne);

现在重新分配是微不足道的:

dg[1] = std::make_unique<FE>(q, pt_type);

没有内存泄漏,没有段错误。

PS。重新考虑是否有必要单独动态分配每个FE对象,而不是直接拥有FE个对象数组。