构造函数中两次malloc时二次分配失败的内存处理设计合理性咨询
问题解答
在你给定的限制(必须在构造函数中执行两次malloc(),不能使用现代C++特性)下,当前的设计是足够完善的,不会出现内存泄漏且无冗余操作,具体分析如下:
关于free(this->ptr0)的必要性
这一步是完全必要的:
- C++中,如果构造函数抛出异常,对象的析构函数不会被调用。当
ptr0已经成功分配内存,但ptr1的malloc()失败时,如果不手动释放ptr0,这块内存就会永久丢失,造成泄漏。 - 手动调用
free(ptr0)后再抛出异常,能确保已成功分配的内存被正确回收,符合无泄漏的要求。
设计的合理性验证
- 当两次
malloc()都成功时,对象正常构造,析构函数会依次free(ptr0)和ptr1,两块内存都能被正确释放。 - 当第一次
malloc()失败时,直接抛出异常,此时ptr0是NULL,没有内存需要释放,不会有问题。 - 析构函数中
free(NULL)是安全的(C标准规定free()对空指针无操作),所以即使其中某块内存分配失败过,析构函数的代码也不会引发问题。
小优化建议
构造函数中抛出异常的代码可以简化,不需要先定义变量,直接写:
throw std::bad_alloc();
内容的提问来源于stack exchange,提问作者D.J. Elkind
相关产品推荐
相关产品推荐

