const指针析构问题:ImmutableString类内存残留1块未释放
问题分析与解决:ImmutableString的内存泄漏问题
嘿,这个问题其实是C++里很容易踩的一个小坑——你犯了内存分配与释放不匹配的错误!
你在构造函数里用new char[strlen(src)+1]分配了一块数组内存,但析构函数里却用了delete m_data来释放。C++里明确规定:
- 用
new分配的单个对象,要用delete释放 - 用
new[]分配的数组,必须用delete[]释放
当你用new[]创建数组时,编译器会在内存块里额外存储数组的元素数量,delete[]需要这个信息才能正确遍历并释放所有元素的内存;而delete只会处理单个对象的内存,不会读取这个额外信息,导致数组的内存没有被完全释放,这就是你看到的残留1块内存的原因。
修正后的代码
只需要把析构函数里的delete改成delete[]就可以了:
#include "immstring.hpp" #include <iostream> #include <cstring> namespace Util { ImmutableString::ImmutableString(const char* src) :m_data{strcpy(new char[strlen(src)+1],src)}{} ImmutableString::~ImmutableString() { delete[] m_data; // 这里改成delete[] } }
另外补充一句:你的char* const m_data声明是没问题的——它表示指针本身不能被修改(符合ImmutableString的设计),但这和内存释放的方式没有关系,核心还是要保证new[]和delete[]配对。
这样修改后,内存泄漏的问题就应该彻底解决了。
内容的提问来源于stack exchange,提问作者dustinboettcher
相关产品推荐
相关产品推荐

