尝试遵循本文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/

10-11 00:49