30dayMakeCppServer
30dayMakeCppServer copied to clipboard
代码存在内存泄露的问题
raii是c++最重要的资源管理方案咋不用呢,里面全是裸指针。 从第四课封装类开始,到后面第15课都存在内存泄露的问题。最明显的就是new的InetAddress和Socket到关闭了客户端连接还没有释放。
- 工业上一些大型项目明确规定禁止使用C++智能指针,如OceanBase、openGauss等。
- 初学不建议用智能指针,手动实现raii可以帮助理解各对象的生命周期,教程里有提到。
- 楼主可能对C++还不是特别熟悉,可以先学一学语言基础。本项目源码大致遵守了《Effective C++》书中第13到15条,已经实现了raii思想,避免了内存泄漏。如InetAddress和Socket在生命周期结束后都会被释放。 InetAddress在连接成功建立后就会被释放,Socket在连接关闭后会被释放。 不排除程序有其他bug或逻辑漏洞,但设计上已经遵守了raii,没有内存泄漏。
Socket资源属于Connection类,客户端断开连接的时候,会造成Connection生命周期终止,Connection在析构的时候,会将Socket析构,Connection.cpp第40行,我感觉没问题啊
我看错了,确实释放了Socket对象,不好意思
我搞错了,这确实不是raii,后续的教程考虑加上raii来管理资源。
嗯嗯。因为我认为的raii最重要的一点是得在析构函数中释放资源,让对象的生命周期和资源持有周期一致。否则不能保证在产生异常的情况下资源正常释放。前面看仓库里的代码,各种位置都有释放就晕了。不过在没有异常的情况下,现在的代码确实都释放了。
day15之前这样写,或许可以让初学者更好地理解对象的生命周期,大项目肯定不适用,有异常就很容易内存泄漏。 因为出于学习目的,我认为手动管理资源也是Cpper必备的技能。 一开始就用智能指针的话,虽然简单方便,初学者也不容易搞明白,不知道对象该在哪儿分配资源、在哪儿释放。 后续会把裸指针换成智能指针,或者自己封装raii类。