【问题标题】:Destructor calling when program is interrupted程序中断时调用析构函数
【发布时间】:2016-04-02 16:54:42
【问题描述】:

我正在使用我创建的 Socket 类在我的程序中创建一个套接字连接。该程序在无限循环中运行并退出它我使用 ctrl-c。现在当我关闭程序时,我的析构函数没有被调用(内存在我读过here 时被释放,但在中断程序时套接字没有被释放)。有没有办法调用析构函数退出这样的程序?

socket类定义:

class Socket
{
        private:
                int m_sock;
                sockaddr_in m_addr;
        public:
                Socket();
                virtual ~Socket();

                // Server initialization
                bool create();
                bool bind ( const int port );
                bool listen() const;
                bool accept ( Socket& ) const;

                // Client initialization
                bool connect ( const std::string host, const int port );

                // Data Transimission
                bool send ( const std::string ) const;
                int recv ( std::string& ) const;

                void set_non_blocking ( const bool );

                bool is_valid() const { return m_sock != -1; }
};

析构函数定义:

Socket::~Socket(){
      close(m_sock);
}

主要功能:

        try {
                // Create the socket
                ServerSocket server ( 15000 );
                std::cout << "Server running on 0.0.0.0:15000" << std::endl;
                std::string res;
                while(true) {
                        ServerSocket new_sock;
                        server.accept ( new_sock );
                        try {
                                while(true) {
                                        std::string data;
                                        new_sock >> data;
                                        res = process_query(data, kv_map, zset_map);
                                        new_sock << res;
                                }
                        }
                  catch(SocketException&) {}
                }
        }
        catch ( SocketException& e ){
                std::cout << "Exception was caught:" << e.description() << "\nExiting.\n";
        }
        return 0;

【问题讨论】:

  • 看代码可能会很方便
  • 这类问题的标准答案是使用 boost::asio 进行套接字和信号 (ctrl-c) 检测。它会为您处理所有的并发症。
  • @RichardHodges 我没有使用任何外部库。我正在使用我编写的 C++ 来实现它。
  • @EdHeal 我已经添加了代码
  • @ayushgp:在没有外部库的情况下,在 C++ 中编写使用套接字的代码是不可能的,因此您的陈述必须是错误的。 (假设您正在使用 libc 提供并由 POSIX 描述的工具。)

标签: c++


【解决方案1】:

是的,您可以为 SIGINT 设置信号处理程序(单击 CTRL-C 时生成的信号)。 使用 C++ 标准库,您可以编写:

void close_connection(int signal)
{
  delete socket; // invoke destructor
  socket.close(); // Alternative, you can add a close method to your socket class
}

// Install a signal handler
std::signal(SIGINT, close_connection);

您可以在此处找到有关如何在 C++ 中管理信号的更多信息 http://en.cppreference.com/w/cpp/utility/program/signal

【讨论】:

  • 有没有办法在我的程序中实现这个?处理函数签名必须等同于handler(int)。我需要将 ServerSocket 对象传递给它,因为我不想让它成为全局对象。
  • std::bind 怎么样?您可以创建一个带有 2 个参数的函数,并将其绑定到您想要在收到 SIGINT 时释放的套接字对象。这样你就避免了全局。
猜你喜欢
  • 1970-01-01
  • 2020-05-08
  • 2016-03-23
  • 2018-05-08
  • 2013-06-24
  • 2011-11-24
相关资源
最近更新 更多