exit.So WSACleanup不运行时,RAII不执行析构函数。有什么问题吗?我发现libnet use WSAStartup没有任何WSACleanup,为什么?WSAStartup可以在一个进程中多次调用,那么如何确保足够的WSACleanup?WSAStartup和WSACleanup?WSAStartup的测试WSAClean编写了这个测试代码,没有发现任何异常(内存的增长或崩溃.)代码:
int main(int argc, char *argv[])
{
int res;
while (1) {
WSADATA wsadata;
res = WSAStartup(0x0202, &wsadata);
printf("WSAStartup 1 times:%d\n", res);
if (res != 0) {
printf("WSAStartup error:%d\n", WSAGetLastError());
exit(1);
}
res = WSAStartup(0x0202, &wsadata);
printf("WSAStartup 2 times:%d\n", res);
if (res != 0) {
printf("WSAStartup error:%d\n", WSAGetLastError());
exit(1);
}
}
return 0;
}发布于 2015-03-13 06:01:12
1) exit()是每个RAII的问题,而不仅仅是套接字。打开文件记忆..。正确的解决方案是避免exit()。
( 2+3)调用与WSAStartup一样多的WSACleanup。我想您想要编写一个套接字类,每个对象只有一个连接,只需在构造函数中调用WSAStartup,在析构函数中调用WSACleanup即可。
这两种方法都在内部使用一个呼叫计数器,它们处理多个呼叫而没有问题。
发布于 2015-03-13 06:00:48
在我看来,只有在堆栈上分配对象时,exit才会销毁该对象,无论是静态的还是全局的。不能使用new分配它。对于new,必须显式删除对象。
良好的实践是,应用程序启动时必须调用WSAStartup,应用程序结束时必须调用WSACleanup。因此,您可以在其构造函数和析构函数中定义执行此任务的类,并定义该类的全局对象。这个班会处理这件事的。
您必须有充分的理由多次初始化WinSock。否则,只进行一次初始化,这是您可以轻松完成的。
发布于 2015-03-13 11:36:17
当调用exit.So WSACleanup不运行时,RAII不会执行析构函数。有什么问题吗?
IME,根本没有。操作系统可以在进程终止时自行清理--这并不愚蠢。
我发现libnet使用没有任何WSAStartup的WSACleanup,为什么?
库设计人员理解上面的内容--操作系统将清理,就像强制进程终止va期间所做的那样。任务经理。
WSAStartup可以在一个进程中多次调用,那么如何确保足够的WSACleanup?
你为什么要这么做?刚开始的时候就叫一次吧。工作完成了。
如何轻松、优雅地使用WSAStartup和WSACleanup?
启动时给WSAStartup打一次电话。如果可以的话,在退出时打电话给WSACleanup (如果你喜欢,或者如果它让你感觉更好:)。
另外,我为没有WSAStartup的测试WSAClean编写了这个测试代码,没有发现任何异常(内存的增长或崩溃.)
该操作系统清理,就像它做的线程,文件,内存等。
如果一个通用桌面操作系统在进程终止时没有处理分配的资源,那么它显然是不可用的。
https://stackoverflow.com/questions/29025713
复制相似问题