30dayMakeCppServer icon indicating copy to clipboard operation
30dayMakeCppServer copied to clipboard

代码存在内存泄露的问题

Open heheda123123 opened this issue 2 years ago • 6 comments

raii是c++最重要的资源管理方案咋不用呢,里面全是裸指针。 从第四课封装类开始,到后面第15课都存在内存泄露的问题。最明显的就是new的InetAddress和Socket到关闭了客户端连接还没有释放。

heheda123123 avatar Sep 23 '22 06:09 heheda123123

  1. 工业上一些大型项目明确规定禁止使用C++智能指针,如OceanBase、openGauss等。
  2. 初学不建议用智能指针,手动实现raii可以帮助理解各对象的生命周期,教程里有提到。
  3. 楼主可能对C++还不是特别熟悉,可以先学一学语言基础。本项目源码大致遵守了《Effective C++》书中第13到15条,已经实现了raii思想,避免了内存泄漏。如InetAddress和Socket在生命周期结束后都会被释放。 InetAddress在连接成功建立后就会被释放,Socket在连接关闭后会被释放。 不排除程序有其他bug或逻辑漏洞,但设计上已经遵守了raii,没有内存泄漏。

yuesong-feng avatar Sep 23 '22 06:09 yuesong-feng

Socket资源属于Connection类,客户端断开连接的时候,会造成Connection生命周期终止,Connection在析构的时候,会将Socket析构,Connection.cpp第40行,我感觉没问题啊

yuesong-feng avatar Sep 23 '22 07:09 yuesong-feng

我看错了,确实释放了Socket对象,不好意思

heheda123123 avatar Sep 23 '22 07:09 heheda123123

我搞错了,这确实不是raii,后续的教程考虑加上raii来管理资源。

yuesong-feng avatar Sep 23 '22 08:09 yuesong-feng

嗯嗯。因为我认为的raii最重要的一点是得在析构函数中释放资源,让对象的生命周期和资源持有周期一致。否则不能保证在产生异常的情况下资源正常释放。前面看仓库里的代码,各种位置都有释放就晕了。不过在没有异常的情况下,现在的代码确实都释放了。

heheda123123 avatar Sep 23 '22 08:09 heheda123123

day15之前这样写,或许可以让初学者更好地理解对象的生命周期,大项目肯定不适用,有异常就很容易内存泄漏。 因为出于学习目的,我认为手动管理资源也是Cpper必备的技能。 一开始就用智能指针的话,虽然简单方便,初学者也不容易搞明白,不知道对象该在哪儿分配资源、在哪儿释放。 后续会把裸指针换成智能指针,或者自己封装raii类。

yuesong-feng avatar Sep 23 '22 08:09 yuesong-feng