个别实例有效,但数组显示内存损坏
Individual instances works but array shows memory corruption
我遇到了一个奇怪的问题,它与 C++ 中的数组有关。基本上,我做了一个class的两个实例,后来我使用了这些实例,导致内存损坏错误。如果我在根本不使用数组的情况下单独创建此 class 的两个实例,则代码有效。
请看下面的代码片段-
int main(int argc, char** argv)
{
ros::init(argc, argv, "my_node");
ros::NodeHandle nh("~");
// this doesn't work
PointCloudSubscriber pcs[2];
pcs[0] = PointCloudSubscriber(nh, "/kinect1/sd/points", 1);
pcs[1] = PointCloudSubscriber(nh, "/kinect2/sd/points", 1);
// this works
//PointCloudSubscriber pc1(nh, "/kinect1/sd/points", 1);
//PointCloudSubscriber pc2(nh, "/kinect2/sd/points", 1);
ros::Rate loop_rate(10);
while (ros::ok())
{
// this doesn't work
for (size_t i = 0; i < 2; i++)
ROS_INFO_STREAM("Cloud topic=" << pcs[i].topic <<
", size=" << pcs[i].point_cloud.data.size());
// this works
//ROS_INFO_STREAM("Cloud topic=" << pc1.topic <<
// ", size=" << pc1.point_cloud.data.size());
//ROS_INFO_STREAM("Cloud topic=" << pc2.topic <<
// ", size=" << pc2.point_cloud.data.size());
ros::spinOnce();
loop_rate.sleep();
}
return 0;
}
class PointCloudSubscriber
{
private:
ros::Subscriber subscriber;
void callback(
const sensor_msgs::PointCloud2ConstPtr& msg);
public:
std::string topic;
sensor_msgs::PointCloud2 point_cloud;
PointCloudSubscriber(){};
PointCloudSubscriber(
ros::NodeHandle& node_handle,
std::string topic_name,
int queue_size);
};
void PointCloudSubscriber::callback(
const sensor_msgs::PointCloud2ConstPtr& msg)
{
point_cloud = *msg;
}
PointCloudSubscriber::PointCloudSubscriber(
ros::NodeHandle& node_handle,
std::string topic_name,
int queue_size)
{
topic = topic_name;
subscriber = node_handle.subscribe<sensor_msgs::PointCloud2>(
topic_name, queue_size, &PointCloudSubscriber::callback, this);
}
下面是报告的输出-
[ INFO] [1526440334.856181149]: Cloud topic=/kinect1/sd/points, size=0
[ INFO] [1526440334.856210465]: Cloud topic=/kinect2/sd/points, size=0
*** Error in `/home/ravi/ros_ws/devel/lib/my_pcl_tutorial/check': double free or corruption (!prev): 0x000000000128f220 ***
Aborted (core dumped)
这里要注意的有趣的事情是数组的每个元素都能够获得正确的 topic
但不知何故无法获得从 boost::shared_ptr
分配的 point_cloud
属性.
为什么会有这种奇怪的行为?这是访问 boost::shared_ptr
的非法用例吗?请问有什么建议吗?
PS:我在 Ubuntu 14.04 LTS 64 位 PC 上使用 ROS Indigo。
PointCloudSubscriber
大概是坏了1。而不是创建 PointCloudSubscriber
的两个默认实例 (1)2 然后为它们分配 "real" 值 (2)2, 做:
PointCloudSubscriber pcs[2] = {
PointCloudSubscriber(nh, "/kinect1/sd/points", 1),
PointCloudSubscriber(nh, "/kinect2/sd/points", 1)
};
1) 看起来是处理资源的,其实只是定义了一个用户提供的构造函数。你应该观察 the rule of 0/3/5.
2) 仅供参考,(1) 和 (2):
PointCloudSubscriber pcs[2]; // (1)
pcs[0] = PointCloudSubscriber(nh, "/kinect1/sd/points", 1); // (2)
pcs[1] = PointCloudSubscriber(nh, "/kinect2/sd/points", 1); // (2)
我遇到了一个奇怪的问题,它与 C++ 中的数组有关。基本上,我做了一个class的两个实例,后来我使用了这些实例,导致内存损坏错误。如果我在根本不使用数组的情况下单独创建此 class 的两个实例,则代码有效。
请看下面的代码片段-
int main(int argc, char** argv)
{
ros::init(argc, argv, "my_node");
ros::NodeHandle nh("~");
// this doesn't work
PointCloudSubscriber pcs[2];
pcs[0] = PointCloudSubscriber(nh, "/kinect1/sd/points", 1);
pcs[1] = PointCloudSubscriber(nh, "/kinect2/sd/points", 1);
// this works
//PointCloudSubscriber pc1(nh, "/kinect1/sd/points", 1);
//PointCloudSubscriber pc2(nh, "/kinect2/sd/points", 1);
ros::Rate loop_rate(10);
while (ros::ok())
{
// this doesn't work
for (size_t i = 0; i < 2; i++)
ROS_INFO_STREAM("Cloud topic=" << pcs[i].topic <<
", size=" << pcs[i].point_cloud.data.size());
// this works
//ROS_INFO_STREAM("Cloud topic=" << pc1.topic <<
// ", size=" << pc1.point_cloud.data.size());
//ROS_INFO_STREAM("Cloud topic=" << pc2.topic <<
// ", size=" << pc2.point_cloud.data.size());
ros::spinOnce();
loop_rate.sleep();
}
return 0;
}
class PointCloudSubscriber
{
private:
ros::Subscriber subscriber;
void callback(
const sensor_msgs::PointCloud2ConstPtr& msg);
public:
std::string topic;
sensor_msgs::PointCloud2 point_cloud;
PointCloudSubscriber(){};
PointCloudSubscriber(
ros::NodeHandle& node_handle,
std::string topic_name,
int queue_size);
};
void PointCloudSubscriber::callback(
const sensor_msgs::PointCloud2ConstPtr& msg)
{
point_cloud = *msg;
}
PointCloudSubscriber::PointCloudSubscriber(
ros::NodeHandle& node_handle,
std::string topic_name,
int queue_size)
{
topic = topic_name;
subscriber = node_handle.subscribe<sensor_msgs::PointCloud2>(
topic_name, queue_size, &PointCloudSubscriber::callback, this);
}
下面是报告的输出-
[ INFO] [1526440334.856181149]: Cloud topic=/kinect1/sd/points, size=0
[ INFO] [1526440334.856210465]: Cloud topic=/kinect2/sd/points, size=0
*** Error in `/home/ravi/ros_ws/devel/lib/my_pcl_tutorial/check': double free or corruption (!prev): 0x000000000128f220 ***
Aborted (core dumped)
这里要注意的有趣的事情是数组的每个元素都能够获得正确的 topic
但不知何故无法获得从 boost::shared_ptr
分配的 point_cloud
属性.
为什么会有这种奇怪的行为?这是访问 boost::shared_ptr
的非法用例吗?请问有什么建议吗?
PS:我在 Ubuntu 14.04 LTS 64 位 PC 上使用 ROS Indigo。
PointCloudSubscriber
大概是坏了1。而不是创建 PointCloudSubscriber
的两个默认实例 (1)2 然后为它们分配 "real" 值 (2)2, 做:
PointCloudSubscriber pcs[2] = {
PointCloudSubscriber(nh, "/kinect1/sd/points", 1),
PointCloudSubscriber(nh, "/kinect2/sd/points", 1)
};
1) 看起来是处理资源的,其实只是定义了一个用户提供的构造函数。你应该观察 the rule of 0/3/5.
2) 仅供参考,(1) 和 (2):
PointCloudSubscriber pcs[2]; // (1)
pcs[0] = PointCloudSubscriber(nh, "/kinect1/sd/points", 1); // (2)
pcs[1] = PointCloudSubscriber(nh, "/kinect2/sd/points", 1); // (2)