为什么MWE会导致以下错误消息?
信号:分段故障(11)
信号代码:未映射的地址(1)
...
MPI_ERR_WIN:无效窗口
#include <mpi.h>
struct A
{
MPI_Win win;
~A()
{
if (win != MPI_WIN_NULL)
{
MPI_Win_free(&win);
}
}
};
int main()
{
MPI_Init(NULL, NULL);
A a;
a.~A();
MPI_Finalize();
return 0;
}
答案 0 :(得分:1)
此代码有2个问题。首先,您没有初始化win
,因此当它被破坏时可能是任何值 - 并且对垃圾值调用MPI_Win_free(...)
是不好的。其次,您手动调用a
的析构函数。这几乎永远不是正确的事情,因为它会被破坏两次。如果您在致电a
之前需要MPI_Finalize()
被破坏,那么只需将其范围限定:
#include <mpi.h>
struct A
{
MPI_Win win = MPI_WIN_NULL;
~A()
{
if (win != MPI_WIN_NULL)
{
MPI_Win_free(&win);
}
}
};
int main()
{
MPI_Init(NULL, NULL);
{
A a;
}
MPI_Finalize();
return 0;
}
最后,虽然这段代码没有书面明确的问题,但遵守0/3/5的规则总是值得的。