冯岳松
冯岳松
close(fd)返回-1有以下几种情况,可以根据errno来判断: EBADF:fd不是一个有效的、开启的文件描述符 EINTR:close()被一个信号中断了 EIO:发生了一个IO错误 ENOSPC, EDQUOT:在NFS文件系统中,第一次写入超过了可用的存储空间大小并不会发生,但后续的write()、fsync()或close()会发生。 绝大部分情况应该是EBADF,当你close(fd)的时候,它已经是一个失效的fd了。 这可能是fd在之前某个时候从epoll上被移除,因为从epoll上移除会自动调用close()来关闭文件描述符。 epoll add error: bad file descriptor和close没有关系,close掉的fd不会被加入到epoll,可能是加入的fd已经被关闭、或者是一个无效fd。
1. 工业上一些大型项目明确规定禁止使用C++智能指针,如OceanBase、openGauss等。 2. 初学不建议用智能指针,手动实现raii可以帮助理解各对象的生命周期,教程里有提到。 3. 楼主可能对C++还不是特别熟悉,可以先学一学语言基础。本项目源码大致遵守了《Effective C++》书中第13到15条,已经实现了raii思想,避免了内存泄漏。如InetAddress和Socket在生命周期结束后都会被释放。 InetAddress在连接成功建立后就会被释放,Socket在连接关闭后会被释放。 不排除程序有其他bug或逻辑漏洞,但设计上已经遵守了raii,没有内存泄漏。
Socket资源属于Connection类,客户端断开连接的时候,会造成Connection生命周期终止,Connection在析构的时候,会将Socket析构,Connection.cpp第40行,我感觉没问题啊
我搞错了,这确实不是raii,后续的教程考虑加上raii来管理资源。
day15之前这样写,或许可以让初学者更好地理解对象的生命周期,大项目肯定不适用,有异常就很容易内存泄漏。 因为出于学习目的,我认为手动管理资源也是Cpper必备的技能。 一开始就用智能指针的话,虽然简单方便,初学者也不容易搞明白,不知道对象该在哪儿分配资源、在哪儿释放。 后续会把裸指针换成智能指针,或者自己封装raii类。
开始续更~
开始续更~
开始续更~
开始续更~
ALE's built-in completion is fine and I personally don't think using ddc.vim is a good idea. It belongs to another ecosystem similar to coc.nvim, and requires both Deno and denops.vim...