PCL可视化器-退出可视化器窗口时从Eigen抛出异常



我尝试了几个PCL可视化教程,并试图将它们结合起来。基本上,它生成一个3D点云,并使用PCL可视化工具显示。这个项目很成功,并发挥了作用。然而,只要我按下'e', 'q'或按右上角的关闭按钮退出程序,就会从Eigen/src/Core/util/Memory.h第241行抛出异常。任何帮助或解释将非常感激。谢谢。

我正在使用msvc-12.0, 64位,Boost版本1.61,PCL版本1.8,VTK版本7.1,Eigen 3.2.8构建

这是Memory.h

中的代码片段
/** internal Frees memory allocated with aligned_malloc. */
inline void aligned_free(void *ptr)
{
  #if !EIGEN_ALIGN
    std::free(ptr);
  #elif EIGEN_MALLOC_ALREADY_ALIGNED
    std::free(ptr);  // Line 241, exception from here
  #elif EIGEN_HAS_POSIX_MEMALIGN
    std::free(ptr);
  #elif EIGEN_HAS_MM_MALLOC
    _mm_free(ptr);
  #elif defined(_MSC_VER) && (!defined(_WIN32_WCE))
    _aligned_free(ptr);
  #else
    handmade_aligned_free(ptr);
  #endif
}

这可能是某种内存位置被释放两次吗?

这是我的"hello world"代码:

#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/visualization/pcl_visualizer.h>

int main(int argc, char** argv) {
    pcl::PointCloud<pcl::PointXYZRGB> cloud;
    // Fill in the cloud data
    cloud.width = 10000;
    cloud.height = 1;
    cloud.is_dense = false;
    cloud.points.resize(cloud.width * cloud.height);
    for (size_t i = 0; i < cloud.points.size(); ++i) {
        cloud.points[i].x = 1024 * rand() / (RAND_MAX + 1.0f);
        cloud.points[i].y = 1024 * rand() / (RAND_MAX + 1.0f);
        cloud.points[i].z = 1024 * rand() / (RAND_MAX + 1.0f);
        cloud.points[i].r = 256 * rand() / (RAND_MAX + 1.0f);
        cloud.points[i].g = 256 * rand() / (RAND_MAX + 1.0f);
        cloud.points[i].b = 256 * rand() / (RAND_MAX + 1.0f);
    }
    //pcl::io::savePCDFileASCII("testpcd.pcd", cloud);
    pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud_ptr(&cloud);
    //visualiser
    boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));
    viewer->setBackgroundColor(0, 0, 0);
    viewer->addPointCloud<pcl::PointXYZRGB>(cloud_ptr, "sample cloud");
    viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "sample cloud");
    viewer->addCoordinateSystem(1.0);
    viewer->initCameraParameters();
    //viewer->resetCameraViewpoint("sample cloud");
    while (!viewer->wasStopped())
    {
        viewer->spinOnce(100);
        boost::this_thread::sleep(boost::posix_time::microseconds(100000));
    }
    return (0);
}

你的问题基本上是这一行:

pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud_ptr(&cloud);

你正在获取一个指向堆栈上对象的指针,并将其传递给一个共享指针。在作用域结束时,共享指针析构函数会尝试释放该内存(它不能这样做,因为它位于堆栈上,而不是堆上)。试试这样做:

pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud_ptr(new pcl::PointCloud<pcl::PointXYZRGB>);
// Fill in the cloud data
cloud_ptr->width = 10000;
cloud_ptr->height = 1;
cloud_ptr->is_dense = false;
cloud_ptr->points.resize(cloud_ptr->width * cloud_ptr->height);
for (size_t i = 0; i < cloud_ptr->points.size(); ++i) {
    cloud_ptr->points[i].x = 1024 * rand() / (RAND_MAX + 1.0f);
    cloud_ptr->points[i].y = 1024 * rand() / (RAND_MAX + 1.0f);
    cloud_ptr->points[i].z = 1024 * rand() / (RAND_MAX + 1.0f);
    cloud_ptr->points[i].r = 256 * rand() / (RAND_MAX + 1.0f);
    cloud_ptr->points[i].g = 256 * rand() / (RAND_MAX + 1.0f);
    cloud_ptr->points[i].b = 256 * rand() / (RAND_MAX + 1.0f);
}

最新更新