【问题标题】:Deleting memory in c++在 C++ 中删除内存
【发布时间】:2015-11-29 17:09:22
【问题描述】:

我正在尝试使用动态内存分配重写我的代码,并且我正在使用this question(和答案)来帮助我。所以按照 Johanes Shaub 的建议,我将我的二维数组声明为:

double (*q_1_matrix)[TIME] = new double[SPACE][TIME];

当我现在运行我的代码时,一切似乎都运行良好。但是当我添加以下行以再次释放内存时:

for(i = 0; i < SPACE; ++i) {
    delete [] q_1_matrix[i];
}
delete [] q_1_matrix;

然后我收到警告: 删除数组'*(q_1_matrix + ((sizetype)(((long unsigned int)i) * 800ul)))' [默认启用] delete [] q_1_matrix[i]; 随后我得到一个分段错误(核心转储)。

有人知道我做错了什么吗?

【问题讨论】:

  • 使用std::vector&lt;std::vector&lt;double&gt;&gt; myvec(A, std::vector&lt;double&gt;(B)),这些错误就会消失。

标签: c++ arrays memory


【解决方案1】:

new 调用实际上创建了一大块内存。它仅被索引为二维数组。 你可以直接调用delete[] q_1_matrix;(没有for循环)。

【讨论】:

    【解决方案2】:

    您提到的问题限制了使用new 的答案,但您几乎可以肯定不需要new

    使用标准库简单;那么,你所有的烦恼都烟消云散了:

    std::vector<std::vector<double>> myvec(SPACE, std::vector<double>(TIME));
    

    如果您将 std::vector&lt;double&gt;(SPACE*TIME) 包装在一个模拟 2D 索引的类中,那就更好了。

    无论如何,如果您真的必须自己管理内存,请记住您在此处创建一个大块动态内存(具有double[SPACE][TIME] 的类型和维度),因此您必须释放只有一次:

    delete[] q_1_matrix;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-06
      • 1970-01-01
      • 2017-03-01
      • 2016-03-16
      • 2013-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多