PCL StatisticalOutliersRemoval 后 1.8.1 云删除崩溃

PCL 1.8.1 crash on cloud delete after StatisticalOutliersRemoval

我有一个使用多个 DLL 文件构建的应用程序。 我正在尝试使用以下代码执行 PCL 的统计异常值删除:

    PointCloudWithRGBNormalsPtr pclCloud(new PointCloudWithRGBNormals());

    ConvertPointCloudToPCL(in_out_cloud /*my own structure which includes xyz, rgb, nx ny nz*/, *pclCloud);

    pcl::StatisticalOutlierRemoval<PointXYZRGBNormal> sor;
    sor.setInputCloud(pclCloud);
    sor.setMeanK(10);
    sor.setStddevMulThresh(1.0);
    sor.filter(*pclCloud);

ConvertPointCloudToPCL:

static void ConvertPointCloudToPCL(const std::vector<Cloud3DrgbN> &in, PointCloudWithRGBNormals &output)
{
    for (auto it = in.begin(); it != in.end(); it++)
    {
        const Cloud3DrgbN &p3d = *it;;
        PointXYZRGBNormal p;
        p.x = p3d.x;
        p.y = p3d.y;
        p.z = p3d.z;
        p.normal_x = p3d.nX;
        p.normal_y = p3d.nY;
        p.normal_z = p3d.nZ;
        p.r = p3d.r;
        p.g = p3d.g;
        p.b = p3d.b;
        output.push_back(p);
    }
}

出于某种原因,如果我从我的 1 个 dll 中调用此函数,它会正常工作。但是,有 1 个 dll,如果我从中调用它,当 pclCloud 超出范围时,我在 handmade_aligned_freeEigenMemory.h 文件中得到一个异常] 函数

我正在使用 Windows 10 64 位,pcl 1.8.1 和 Eigen 3.3(试过 3.3.4,同样的东西)

更新:

进一步挖掘后,我发现 EIGEN_MALLOC_ALREADY_ALIGNED 被设置为 0,因为我在我的 "problematic" DLL 中使用了 AVX2。我仍然不确定为什么使用 Eigen 的 "handmade" 对齐 malloc/free 会导致此崩溃。

Eigen、PCL 和 AVX

似乎存在一个已知问题(参见 this

嗯,我找到了问题以及如何解决它。

windows 的 "All in 1 installer" 附带的 DLL 似乎没有在 AVX/AVX2 支持下编译。

将这些库与我自己的 DLL(使用 AVX 编译的 DLL)链接时,这种不匹配导致 Eigen 使用不同类型的分配和释放内存,从而导致崩溃。

我使用 AVX2 从源代码编译了 PCL 并链接了这些库,一切正常。

值得一提的是,之前工作的 DLL 现在有问题,因为它没有 AVX,PCL 现在有。