自定义c_string类addElement函数内存泄漏问题的最优解决方法咨询
修复自定义字符串类中的内存泄漏问题
你定位的内存泄漏问题非常准确:在原代码中,delete chain;之后执行了chain = new char[chain_total];,紧接着又将chain赋值为tmpChain——这导致刚通过new分配的内存块失去了所有引用,永远无法被释放,最终造成内存泄漏。
修复后的addElement实现
void c_string::addElement(char ch) { char *tmpChain = new char[chain_total + 1]; // 复制原有字符串数据 for(size_t i = 0; i < chain_total; i++) tmpChain[i] = chain[i]; // 添加新字符并更新字符串长度 tmpChain[chain_total++] = ch; // 释放旧内存(注意用delete[]匹配new[]) delete[] chain; // 直接让chain指向预先分配好的新内存,无需额外new操作 chain = tmpChain; }
关键修复点说明
- 移除了多余的
chain = new char[chain_total];语句:tmpChain已经是为新字符串长度分配好的内存,直接复用即可,无需重复分配。 - 修正了内存释放方式:原代码用
delete chain;释放数组是错误的,因为chain是通过new[]分配的数组,必须用delete[]来释放,否则会触发未定义行为。
进一步优化:降低频繁内存分配的开销(可选)
每次添加字符都重新分配内存的效率极低,你可以引入预分配容量的策略,减少内存分配和数据复制的次数:
class c_string { private: char *chain; size_t chain_total; // 当前字符串实际长度 size_t capacity; // 已分配的内存总容量 public: c_string() : chain(nullptr), chain_total(0), capacity(0) {} ~c_string() { delete[] chain; } void addElement(char ch); }; void c_string::addElement(char ch) { // 容量不足时进行扩容,初始容量设为16,之后每次翻倍 if (chain_total >= capacity) { size_t new_capacity = (capacity == 0) ? 16 : capacity * 2; char *tmpChain = new char[new_capacity]; // 复制原有数据 for(size_t i = 0; i < chain_total; i++) tmpChain[i] = chain[i]; delete[] chain; chain = tmpChain; capacity = new_capacity; } // 添加新字符 chain[chain_total++] = ch; }
内容的提问来源于stack exchange,提问作者Ninja
相关产品推荐
相关产品推荐

