尝试遵循本文http://goo.gl/DvglYv中显示的示例,我设计了以下类:
Bridge.h:
class Bridge {
public:
IfFrameSender *pFrmSender;
std::string senderName;
...
Bridge(cfg_settings cfg_sett);
void saveFrame(cv::Mat &cvFrm, uint XOff, uint YOff);
...
}
特别是pFrmSender是一个指向虚拟类IfFrameSender的指针。
在Bridge.cpp中,我定义了构造函数:
Bridge::Bridge(cfg_settings cfg_sett)
{
...
/* Instantiates a sender_by_socket object using a factory */
IfFrameSender *pFrmSender = FrameSenderFactory::Get()->CreateFrameSender("FrameSenderBySocket");
...
}
和方法:
void Bridge::saveFrame(cv::Mat &cvFrm, uint XOff, uint YOff)
{
...
pFrmSender->sendFrame(...);
...
}
好吧,当我尝试调用pFrmSender时出现段错误。我做了一些调试,发现在Bridge :: saveFrame方法中,该成员的内存地址不正确(CCCCCCCC),而在构造函数中,该成员的状态正确,我已打印了其内存地址,并且看来始终如一。
我已经在头文件中声明了该成员,所以我认为它对Bridge类的任何方法都是可见的。我哪里错了?
提前致谢。
最佳答案
问题是 :
Bridge::Bridge(cfg_settings cfg_sett)
{
/* Following is a temporary variable, which is destroyed after this ctor returns */
IfFrameSender *pFrmSender = FrameSenderFactory::Get()->CreateFrameSender("FrameSenderBySocket");
}
您正在构造函数中创建一个新的(临时)
IfFrameSender *
,一旦构造函数返回,它将被销毁。而是初始化一个声明为类成员的对象:Bridge::Bridge(cfg_settings cfg_sett)
{
this->pFrmSender = FrameSenderFactory::Get()->CreateFrameSender("FrameSenderBySocket");
}
另外,在使用指针时检查
null
是更好的做法:void Bridge::saveFrame(cv::Mat &cvFrm, uint XOff, uint YOff){
if(pFrmSender!=nullptr)
pFrmSender->sendFrame(...);
}
虽然,在这种情况下,我猜想如果无法构造
pFrmSender
,那么如果创建自身毫无意义,那么Bridge::Bridge()
可能会引发异常。关于c++ - 尝试访问对象成员的段错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24019471/