如题:如何在linux中将pcl读取的点云数据写入共享内存?
我尝试了使用shmat 函数连接到我设置的Ponitcloud中
typedef pcl::PointXYZ PointT;
typedef pcl::PointCloud<PointT> PointCloud;
PointCloud::Ptr output (new PointCloud());
output = (PointCloud::Ptr)shmat(shmid, NULL, 0);
报错::
思考:是shmat返回shmaddr的地址无法直接赋值给pcl创建的指针,pcl创建的指针是boost::shared_ptr类型,是const类型,无法改变内存地址。
需要用第三方的空指针传递数据。
答:pcl::PointCloud<pal::PointXYZ>指针是const指针,创建需要初始化,同时不能改变其指针地址。需要重新定义指针类型。
———————————————————————8/25—————————————————————————
发现了新的点云类型
PointCloud output;//非指针点云
//使用PointCloud进行转换
PointCloud* o = &output;
int sizecloud=sizeof(cloud)+3*8*cloud.points.size();
std::cout<<"size: "<<sizecloud<<"\n"<<std::endl;
int shmid = shmget((key_t)7234, sizecloud , IPC_CREAT|0666);
o = (PointCloud*)shmat(shmid, NULL, 0);
std::cout<<"o3: "<<o<<"\n"
<<"*"<<*o<<"\n"<<std::endl;
pcl::copyPointCloud(output, *o);
std::cout<<"o4: "<<o<<"\n"
<<"*"<<*o<<"\n"<<std::endl;
现在发现一个问题是pcl的在为pointcloud指针使用了struct创建结构,同时创建了留空指针。同时C++指针是不能留空,自动分配,在共享内存里了非本进程的指针地址,共享指针就会指向错误内存区(0xffffffff...)。产生段错误。
但是进一步报错是malloc.c文件并没有被生成
1.猜测是因为在调试其中没有足够权限。
2.malloc.c函数本身是c动态内存分配的文件,错误出在这个地方有可能是某个不知道的地方出错了。
答:共享内存区创建在了满溢区域,内存不足,导致内存分配出错。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
本问题答案在下方评论本人已给出
正确姿势:
上次的回答中其实程序已经跑通,但是在创建共享内存的时候出现了错误,导致出现了内存管理错误的问题。
接下拉本人将深入探究共享内存原理和pcl库中的数据结构作详细报告