面试题答案
一键面试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;
}