gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 06:50:39 25 4
gpt4 key购买 nike

尝试遵循本文中显示的示例 http://goo.gl/DvglYv我设计了以下类(class):

桥.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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com