MPI_Win_free导致无效的窗口错误

时间:2018-01-08 16:19:55

标签: c++ mpi

为什么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;
}

1 个答案:

答案 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的规则总是值得的。