【问题标题】:MPI_Win_free causes invalid window errorMPI_Win_free 导致无效窗口错误
【发布时间】:2018-01-09 00:34:36
【问题描述】:

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

【问题讨论】:

    标签: c++ mpi


    【解决方案1】:

    此代码有 2 个问题。首先,您没有初始化win,因此当它被破坏时,它可能是任何值——并且在垃圾值上调用MPI_Win_free(...) 是不好的。其次,您手动调用a 的析构函数。这几乎绝不是正确的做法,因为它会被破坏两次。如果您需要在调用 MPI_Finalize() 之前将 a 破坏,那么只需确定它的范围即可:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多