【发布时间】:2021-11-06 02:54:34
【问题描述】:
存在运行时错误:
在抛出 'std::bad_alloc' 实例后调用终止
what(): std::bad_alloc 中止(核心转储)
来自下面的 c++ 类:
class PoseDrawer
{
public:
PoseDrawer() : tf_(), target_frame_("turtle1"), tf_filter_(point_sub_, tf_, target_frame_, 10)
{
point_sub_.subscribe(n_, "turtle_point_stamped", 10);
tf_filter_.registerCallback( &PoseDrawer::msgCallback, this );
} ;
private:
message_filters::Subscriber<geometry_msgs::PointStamped> point_sub_;
tf::TransformListener tf_;
tf::MessageFilter<geometry_msgs::PointStamped> tf_filter_;
ros::NodeHandle n_;
std::string target_frame_;
void msgCallback(const boost::shared_ptr<const geometry_msgs::PointStamped>& point_ptr)
{
//stuff
}
};
这是由于tf_filter_ 的初始化方式,因为如果我将tf_filter_ 转换为如下指针,它将按预期工作。那么上面的代码和下面的代码有什么区别呢?
class PoseDrawer
{
public:
PoseDrawer() : tf_(), target_frame_("turtle1")
{
point_sub_.subscribe(n_, "turtle_point_stamped", 10);
tf_filter_=new tf::MessageFilter<geometry_msgs::PointStamped>(point_sub_, tf_, target_frame_, 10);
tf_filter_->registerCallback( &PoseDrawer::msgCallback, this );
} ;
private:
message_filters::Subscriber<geometry_msgs::PointStamped> point_sub_;
tf::TransformListener tf_;
tf::MessageFilter<geometry_msgs::PointStamped>* tf_filter_;
ros::NodeHandle n_;
std::string target_frame_;
void msgCallback(const boost::shared_ptr<const geometry_msgs::PointStamped>& point_ptr)
{
//stuff
};
};
【问题讨论】:
-
已尝试附加调试器?你知道它在哪一行失败了吗?
-
std::bad_alloc通常意味着您的内存已用完。我们这里没有足够的信息来诊断问题。可以发minimal reproducible example吗? -
当您在自己的构造函数中直接实例化一个对象时,或者当该对象在构造函数中实例化的其他对象的其他构造函数中实例化该对象时,可能会发生这种情况。这会导致构造函数的直接或间接递归。
-
我在问题中编辑并添加了工作代码。问题显然源于
tf_filter_在类中的实例化方式。 -
我从死容器上调用函数得到了
std::bad_allocs。将tf_filter_移动到动态内存并泄漏它的方式使我认为您的PoseDrawer实例在某些时候被意外破坏,其他一些代码仍然引用它现在已死的tf_filter_并稍后访问它。不过,这只是一个有根据的猜测——使用调试器准确找出引发此异常的代码会有很大帮助。
标签: c++ class constructor