c++ - 使用 impi 库删除未分配内存时的错误

标签 c++ memory compilation mpi dynamic-memory-allocation

在一个类方法的 if 语句的主体中分配了两个数组,这是一个输入相关的,在我的例子中,它从来没有为真。因此,在我的例子中,这两个数组从未被分配过。但随后此类的析构函数删除了这两个 [未分配的] 数组。

我在使用不同的 MPI 库和 C++ 编译器时从未遇到过此代码(基于 C++ MPI+OpenMP)的任何错误,除非我开始使用 impi 库。

代码运行正常,直到运行结束,然后抛出消息“您的一个应用程序进程错误终止”,退出代码为 6 或 11。

我修复了这个错误,但现在我只是好奇为什么 impi 会发生这种情况以及如何以最安全的方式删除未分配的数组。

最佳答案

how it is possible to delete an unallocated array in the most safe way.

总是初始化你的变量。在这种情况下,使用 nullptr 初始化指针,稍后可以安全地传递给 delete:

sometype *pointer = nullptr;
if( condition ) {
     pointer = new sometype[size];
     // dealing with it
}
...
delete [] pointer;

但更好的是使用 std::unique_ptrstd::shared_ptr,它们已正确默认初始化并管理内存。

关于c++ - 使用 impi 库删除未分配内存时的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46733580/

相关文章:

c++ - winapi C++ 处理焦点

c++ - SFINAE 方法在 clang 中完全禁用基类的模板方法

python - Apache 子进程在分配一个巨大的 block 后不释放内存

ios - 从内存中释放图像, swift

compilation - Bazel 中的项目范围的 copts 和 linkopts

c++ - 关于 C++ 中的析构函数;

c++ - 使用嵌套的 boost::binds

将未知类型的数据复制到 C 中的数组中

java - Java 中没有预处理器——如果我有条件地喜欢详细的调试输出,最好的方法是什么?

c# - 如何创建 `ExpressionType.IsTrue/IsFalse` ?