簡體   English   中英

如何調用純虛函數

[英]How is a pure virtual function being called

我正在使用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錯誤的pure virtual method called 但是,如果我在gdb中逐步執行代碼,那么我將成功接受來自客戶端的連接並向其發送數據。 ServerRunnablerun不是純虛函數,應該調用它。

libPoco線程的代碼示例位於http://pocoproject.org/slides/130-Threads.pdf

我也在想我可能在構造函數中調用純虛方法,但是在構造函數中沒有任何東西,我只是使用默認的destuctor。 是否有某種方法可以確定調用哪些純虛函數? 在gdb? 謝謝。

問題很可能是在調用run方法之前, serverIt對象超出了范圍。

你沒有任何控制線程可以運行的時間,所以它可能是在你的類的run方法被調用之前循環迭代,但是你的對象被破壞了,當然它的破壞當然是虛函數表。

Pool.start()

啟動一個線程並返回。 這就是為什么在你鏈接他們的線程池示例的PDF中看起來像這樣:

main()
    Poco::ThreadPool::defaultPool().start(runnable);
    Poco::ThreadPool::defaultPool().joinAll();
    return 0;

當您在gdb中逐步執行它時,您可以讓線程有時間在實例變量超出范圍之前執行其操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM