默认析构函数是否会调用MPI_Comm_free?自定义析构相关疑问
#include <iostream> #include <vector> #include <mpi.h> class MyClass { public: MyClass(std::vector<double>& v0, std::vector<double>& v1, std::vector<double>& v2, MPI_Comm mycomm); ~MyClass() = default; private: std::vector<double> v0_,v1_,v2_; MPI_Comm mycomm_; }; MyClass::MyClass(std::vector<double>& v0,std::vector<double>& v1,std::vector<double>& v2, MPI_Comm mycomm) : v0_(v0), v1_(v1), v2_(v2){ // Get the group of processes in MPI_COMM_WORLD MPI_Group world_group; MPI_Comm_group(mycomm, &world_group); const int ranks[2] = {0,1}; // Construct a group containing all of the ranks in world_group MPI_Group new_group; MPI_Group_incl(world_group, 2, ranks, &new_group); // Create a new communicator based on the group MPI_Comm_create_group(mycomm, new_group, 0, &mycomm_); } int main(int argc, char *argv[]) { int IdProc,NbProc; MPI_Init(&argc,&argv); std::vector<double> v0 = {1,2}; std::vector<double> v1 = {1,2,3}; std::vector<double> v2 = {1,2,3,4}; { MyClass my_class(v0,v1,v2,MPI_COMM_WORLD); } MPI_Finalize(); return 0; }
问题解答
疑问1:默认析构函数~MyClass() = default; 是否会自动调用MPI_Comm_free(&mycomm_)?
不会。默认析构函数仅处理C++内置类型的销毁,以及自动触发类成员中带析构逻辑的对象(比如std::vector)的析构。MPI_Comm本质是一个句柄(通常是整数类型),属于内置类型范畴,默认析构只会销毁这个变量本身,不会主动调用MPI_Comm_free释放MPI通信器资源,会造成资源泄漏。
疑问2:若不会,在自定义MyClass的析构函数中调用MPI_Comm_free时,是否需要手动调用std::vector等成员的析构函数?
不需要。自定义析构函数执行时,编译器会自动按照成员变量声明的逆序,调用所有成员的析构函数。你只需要在析构里处理MPI_Comm这类需要手动释放的资源即可,std::vector的析构会由编译器自动触发,手动调用反而会导致重复析构,引发未定义行为。
关于默认析构与自定义逻辑冲突的补充
= default是要求编译器生成默认析构,一旦编写了自定义的析构函数体,就不能再用= default声明,二者互斥。正确的自定义析构写法示例:
~MyClass() { // 仅当通信器句柄有效时调用释放,避免无效句柄引发错误 if (mycomm_ != MPI_COMM_NULL) { MPI_Comm_free(&mycomm_); } }
内容的提问来源于stack exchange,提问作者Wololllooo
相关产品推荐
相关产品推荐

