在给定的代码中,存在内存泄漏的问题。在循环中,每次创建一个新的点云指针并将其添加到容器'clouds1'中,但是没有释放这些指针的内存。

为了解决这个问题,可以在循环结束后,手动释放每个点云指针的内存。可以通过调用'clouds1.clear()'来实现,该函数会释放容器中的每个指针所占用的内存。

修改后的代码如下:

void mintree(std::vector<Edge> result, pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud100)
{
	std::vector<pcl::PointCloud<pcl::PointXYZRGB>::Ptr> clouds1; // 新增的点云指针容器
	std::copy(result.begin(), result.end(), std::back_inserter(resulta));
	int begin6 = 0;
	int m = yejian->size(); // 路径数就是叶尖数
	for (int i = 0; i < m; ++i)
	{
		pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGB>);
		clouds1.push_back(cloud);
	}
	//首先设置循环次数,每次循环都会产生一条路径
	for (size_t i = 0; i < yejian->points.size(); ++i) //找不同叶片的循环
	{
		// 创建每条路径的点云指针clouds[i]
		pcl::PointCloud<pcl::PointXYZRGB>::Ptr yr1 = clouds1[i];
		cout << "路径" << i + 1 << "所有骨架点:" << endl;
		pcl::PointXYZRGB& point54 = jinqi; //防止修改掉茎起点
		cout << point54;
		pcl::PointXYZRGB& point56 = point54; //将搜索的起点统一设置为茎秆的起点
		clouds1[i]->push_back(point56); //起点加入路径
		double distances = 0; //设置路径的距离
		for (int i = 0; i < cloud100->size(); i++) //找一个叶片内不同点的循环,确保不会遗漏边
		{
			for (auto it = resulta.begin(); it != resulta.end();)//遍历所有生成树的边
			{
				pcl::PointXYZRGB& point53 = point56; //53表示上一个点的数据
				const auto& edge = *it;
				pcl::PointXYZRGB p0 = cloud100->points[edge.src]; //在点云cloud里面找到该索引对应的点值
				pcl::PointXYZRGB p00 = cloud100->points[edge.tgt];
				//判断叶尖点与找到边两点是否相同,若相同则将该边加入yr1点云指针,将该边加入容器yr1
				if ((point56.x == p0.x) && (point56.y == p0.y) && (point56.z == p0.z))
				{
					yr1->push_back(p00); //yr1表示储存的路径
					distances = distances + euclideanDistance(point56, p00);
					point56 = p00;
				}
				else if ((point56.x == p00.x) && (point56.y == p00.y) && (point56.z == p00.z))
				{
					yr1->push_back(p0);
					distances = distances + euclideanDistance(point56, p0);
					point56 = p0;
				}
				//判断寻找的终点,当遇到叶节点时,此时点56为在分支上的新节点且加入了路径
				for (const auto& point9 : jie->points)
				{
					float x1 = point9.x;
					float y1 = point9.y;
					float z1 = point9.z;
					if (x1 == point53.x && y1 == point53.y && z1 == point53.z)
					{
						//如果点53是叶节点,那么56就是分支上的一点,而且已经加入到了路径。此时的边代表的就是分支上第一段的关系
						it = resulta.erase(it);
						//删除后,最小生成树就没有这两点的对应关系,下次就不会搜索到。但是删除的话就会影响下一次的路径寻找
						//下一次在新的路径寻找时就会找不到,所以在
					}
				}
				bool fsa = false;
				for (const auto& point93 : yejian->points)
				{
					float x2 = point93.x;
					float y2 = point93.y;
					float z2 = point93.z;
					if (x2 == point56.x && y2 == point56.y && z2 == point56.z)
					{
						fsa = true;
						break;
					}
				}
				if (fsa != false)
				{
					break;
				}
			}
		}
		begin6++;
		for (size_t i = 0; i < yr1->size(); ++i)
		{
			std::cout << "Point " << i + 1 << " coordinates" << "("
				<< yr1->points[i].x << ", "
				<< yr1->points[i].y << ", "
				<< yr1->points[i].z << ")" << std::endl;
		}
		cout << "  " << endl;
	}
	clouds1.clear(); //释放点云指针的内存
}

在修改后的代码中,通过'clouds1.clear()'来释放每个点云指针的内存。这样可以避免内存泄漏问题。

此外,还可以使用智能指针来管理指针,例如'std::shared_ptr'或'std::unique_ptr'。智能指针可以自动释放指针所占用的内存,避免内存泄漏。

C++ 代码内存泄漏检测与修复:pcl::PointCloud<pcl::PointXYZRGB> 指针

原文地址: https://www.cveoy.top/t/topic/qAMs 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录