2016-06-29 6 views
0

PCLビジュアライザーのチュートリアルをいくつか試してみましたが、それらを組み合わせようとしました。基本的に、3D点群を生成し、PCLビジュアライザーを使用して表示します。プロジェクトは成功し、それは機能します。しかし、プログラムを終了するために 'e'、 'q'を押すか、右上隅の閉じるボタンを押すと、Eigen/src/Core/util/Memory.h行241から例外がスローされます。 どんな助けや説明もとても感謝しています。ありがとう。PCLビジュアライザー - ビジュアライザーウィンドウを終了するときにEigenからスローされました

私はアイゲン3.2.8、MSVC-12.0、64ビット、ブーストバージョン1.61、PCLバージョン1.8、VTKのバージョン7.1を使用して構築してい

これは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 
} 

からの抜粋ですこれは2回解放される何らかのメモリロケーションかもしれませんか?

これは私の「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); 
} 
+0

この問題はよく分かります。他のヘッダの前に '#include 'を入れてみることはできますか? – mindriot

+0

msvc-12.0、Windows、x64。 私は[ここ](http://stackoverflow.com/questions/6365058/alternative-unistd-h-header-file-for-visual-studio-2010)によると ''を試しました。これまでのところ、私はまだ同じ問題を抱えています – Soon

+0

おっと、待って、心配しないでください。あなたの問題は他のものです、私は答えを書くでしょう。 – mindriot

答えて

1

あなたの問題は、本質的にこのラインである:

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); 
} 
+0

これは間違いなく問題のおかげで解決します。共有ポインタ、スタック、ヒープについて学ぶことがたくさんあるみたいです。ありがとう。 – Soon

関連する問題