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);