【发布时间】:2020-12-05 13:25:12
【问题描述】:
我使用 lambda 函数将点云存储到向量的每个实例中。即使我通过引用传递向量,当我尝试访问向量的每个实例时,我也会收到此错误:
typename boost::detail::sp_member_access<T>::type boost::shared_ptr<T>::operator->() const [with T = pcl::PointCloud<pcl::PointXYZI>; typename boost::detail::sp_member_access<T>::type = pcl::PointCloud<pcl::PointXYZI>*]: Assertion `px != 0' failed.
我的代码:
int size_ = 2;
std::vector<Cloud::Ptr> vector_cloud(size_);
for(int i=0; i<size_; i++)
{
Cloud::Ptr cloud_(new Cloud);
vector_cloud.push_back(cloud_);
}
auto fonk1 = [ &vector_cloud, size_]()
{
for(int i=0; i<size_; i++)
{
std::cout << "for debug" << std::endl;
Point p;
p.x = 0;
p.y = 0;
p.z = 0;
p.intensity = 0;
vector_cloud[i]->points.push_back(p);
}
};
fonk1();
std::cout << "Cloud size: " << vector_cloud[0]->size() << std::endl;
不是编译错误,输出是:
for debug
当我尝试推动一个点时,我收到了这个错误。 Cloud::Ptr 是 pcl::PointCloud<pcl::pointXYZI>::Ptr 和 Point 是 pcl::PointXYZI
即使我也删除了这些行:
for (int i=0; i<2; i++) {
Cloud::Ptr cloud(new Cloud);
vector_cloud_frustums.push_back(cloud);
}
错误是一样的。
【问题讨论】:
-
Cloud和Cloud::Ptr是什么?可以发minimal reproducible example 吗? -
另一个非常有趣的 UB 案例。即使没有开启优化,有趣的事情也会发生。请参阅我的答案中的链接,我玩得很开心。取消注释最后一行会完全更改 之前 的输出
-
我删除了相关行,错误是一样的。我更新了帖子。另外,我必须使用 Ptr 类型,因为我从事的是大型软件项目。
-
如果删除这些行,那么向量中仍有 2 个元素不指向
Cloud实例。稍等,我会更新答案 -
查看编辑后的答案
标签: c++ function lambda pass-by-reference