【问题标题】:Safe way to reassign part of a pointer array重新分配部分指针数组的安全方法
【发布时间】:2017-11-02 19:58:41
【问题描述】:

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

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

我得到一个段错误。当我不这样做时,代码会运行,但会出现内存泄漏。

【问题讨论】:

  • 你能给我们一个minimal reproducible example吗?您的 delete 代码块对我来说是正确的。
  • 猜猜这与dg 的真正含义有关。是的,我同意奥利弗先生的观点!
  • 很难说不知道发生了什么。请提供minimal reproducible example
  • 为什么要使用指针和动态分配?为什么不只是 FE 对象(不是指针)的 std::vector

标签: c++ arrays pointers memory-leaks


【解决方案1】:
delete dg[1];
dg[1] = new FE(q, pt_type);

如果此程序出现段错误,则很可能意味着 dg[1] 或其副本之一可能已被其他代码片段先前删除。其他可能性:实际上是FE 的构造函数出现了段错误。 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 对象数组是否有意义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-13
    • 1970-01-01
    • 2017-09-25
    相关资源
    最近更新 更多