试图访问对象成员的段错误

时间:2014-06-03 15:46:39

标签: c++ oop

尝试按照本文中显示的示例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时,我遇到了一个seg错误。我做了一些调试,我发现在Bridge :: saveFrame方法中,该成员的内存地址不正确(CCCCCCCC),而在构造函数中,它已正确实现,我&#39 ; ve打印了它的内存地址,似乎是一致的。

我已经在头文件中声明了该成员,所以我认为它可以通过Bridge类的任何方法显示。我哪里错了?

提前致谢。

2 个答案:

答案 0 :(得分:1)

问题是:

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()如果创建本身毫无意义,则可能会抛出异常。

答案 1 :(得分:0)

试试这个:

Bridge::Bridge(cfg_settings cfg_sett) :
    pFrmSender(FrameSenderFactory::Get()->CreateFrameSender("FrameSenderBySocket"))
{

}

这样你实际上是在初始化你的班级成员。