MST

星途 面试题库

面试题:C++ RAII在网络连接管理中的基本应用

请简述C++ RAII机制的原理,并说明如何在网络连接管理场景中利用RAII来确保网络连接的正确建立与关闭。假设你使用socket进行网络编程,给出一个简单的RAII风格的网络连接类示例代码,包含构造函数建立连接和析构函数关闭连接的逻辑。
24.2万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

RAII机制原理

RAII(Resource Acquisition Is Initialization)即资源获取即初始化。它的核心思想是将资源(如内存、文件句柄、网络连接等)的获取与对象的生命周期绑定。当对象创建时,在构造函数中获取资源;当对象销毁时,在析构函数中释放资源。这样可以利用C++对象的自动销毁机制来确保资源在不再需要时能被正确释放,避免资源泄漏。

在网络连接管理场景中利用RAII

在网络连接管理场景中,RAII可以确保网络连接在对象创建时正确建立,在对象销毁时正确关闭。当一个RAII风格的网络连接类对象被创建时,构造函数负责建立网络连接(例如调用socket函数创建套接字并进行连接相关的操作);当对象超出作用域或被显式删除时,析构函数会自动调用以关闭网络连接(例如调用close函数关闭套接字)。

示例代码

#include <iostream>
#include <string>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/types.h>

class NetworkConnection {
public:
    NetworkConnection(const std::string& ip, int port) {
        sockfd = socket(AF_INET, SOCK_STREAM, 0);
        if (sockfd == -1) {
            throw std::runtime_error("Failed to create socket");
        }

        sockaddr_in servaddr;
        servaddr.sin_family = AF_INET;
        servaddr.sin_port = htons(port);
        servaddr.sin_addr.s_addr = inet_addr(ip.c_str());

        if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) != 0) {
            close(sockfd);
            throw std::runtime_error("Failed to connect");
        }
    }

    ~NetworkConnection() {
        close(sockfd);
    }

private:
    int sockfd;
};

可以这样使用这个类:

int main() {
    try {
        NetworkConnection conn("127.0.0.1", 8080);
        // 在这里进行网络通信操作
    } catch (const std::exception& e) {
        std::cerr << "Exception: " << e.what() << std::endl;
    }
    return 0;
}