簡體   English   中英

PCL可視化工具-退出可視化工具窗口時從本征拋出的異常

[英]PCL visualizer - exception thrown from Eigen when exit visualizer window

我嘗試了一些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,本征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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM