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

C++ 重新分配指针数组部分的安全方法,c++,arrays,pointers,memory-leaks,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]指向的旧对象需要删除。当我这样做的时候 delete dg[1]; dg[1] = new FE(q, pt_type); 我犯了一个错误。当我不这样做时,代码会运行,但内存泄漏 如果此程序出现故障,则很可能意味

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

FE **dg = new FE*[ne];
for (int i = 0; i < numEle; i++)
{
    dg[i] = new FE(p, pt_type);
}
这显然是有问题的,因为dg[1]指向的旧对象需要删除。当我这样做的时候

delete dg[1];
dg[1] = new FE(q, pt_type);
我犯了一个错误。当我不这样做时,代码会运行,但内存泄漏

如果此程序出现故障,则很可能意味着
dg[1]
或其一个副本之前可能已被其他代码段删除。其他可能性:实际上是
FE
的构造函数导致了故障
dg
或其一份副本已被删除
ne
为0,因此
dg[1]
超出范围

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

例如:

std::vector<std::unique_ptr<FE>> dg(ne);
std::矢量dg(ne);
现在,重新分配是微不足道的:

dg[1] = std::make_unique<FE>(q, pt_type);
dg[1]=std::使_唯一(q,pt_类型);
没有内存泄漏,没有SEG故障



PS.重新考虑将每个
FE
对象分别动态分配是否有意义,而不是直接拥有一个
FE
对象数组。

您能给我们一个建议吗?你的
delete
代码块在我看来是正确的。我猜这与
dg
的真正含义有关。是的,我同意奥利弗先生!如果不知道更多,很难说发生了什么。请提供答案。为什么使用指针和动态分配?为什么不仅仅是一组
FE
对象(而不是指针)?
std::vector<std::unique_ptr<FE>> dg(ne);
dg[1] = std::make_unique<FE>(q, pt_type);