gpt4 book ai didi

c++ - 纯虚函数是如何被调用的

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:19:35 25 4
gpt4 key购买 nike

我正在使用 libPoco 创建一个虚拟服务器来测试一些客户端代码。

class ServerRunnable: public Poco::Runnable {
public:
ServerRunnable(StreamSocket conn) : conn(conn) {
}

void run(){
string mess("Can you hear me?\n");
try{
this->conn.sendBytes(mess.c_str(), mess.size());
} catch (Poco::Exception& ex){
cerr << ex.displayText() << endl;
return;
}
cerr << "The message has been sent." << endl;
}

void setConn(StreamSocket inConn){
this->conn = inConn;
}
private:
StreamSocket conn;
};


int main(int argc, char **argv){
ServerSocket s;
try{
s.bind(8083, true);
} catch (Exception &ex){
cerr << ex.displayText() << endl;
exit(1);
}
s.listen(124);

Poco::ThreadPool Pool(10, 25, 60, 128);
while(1){
try{
StreamSocket conn = s.acceptConnection();
ServerRunnable serveIt(conn);

Pool.start(serveIt);
} catch (Exception &ex){
cerr << ex.displayText() << endl;
Pool.joinAll();
exit(1);
}
}
return 0;
}

Poco::Runnable 是一个抽象类,我很确定run是一个纯虚函数。 Pool.start(serveIt) 似乎在调用 ServerRunnablerun。当我从控制台运行它时,我始终收到 pure virtual method called 错误。但是,如果我在 gdb 中单步执行代码,那么我将成功地接受来自客户端的连接并向它们发送数据。 ServerRunnablerun 不是纯虚函数,应该调用它。

libPoco 线程的代码示例位于 http://pocoproject.org/slides/130-Threads.pdf

我也在想,我可能会在构造函数中调用纯虚方法,但构造函数中什么也没有,我只是在使用默认的析构函数。有什么办法可以确定调用纯虚函数的位置和内容吗?在 gdb 中?谢谢。

最佳答案

问题很可能是您的 serverIt 对象在它的 run 方法被调用之前超出范围。

您无法控制线程何时运行,因此循环可能在调用类的 run 方法之前进行迭代,但随后您的对象已被销毁,当然还有虚函数表的破坏。

关于c++ - 纯虚函数是如何被调用的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17357786/

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