You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于分离链接的哈希表set类析构函数失效问题求助

析构函数问题分析与修复

你的析构函数存在三个核心问题,下面逐一说明并给出修复方案:

1. 数组遍历范围错误

你用i <= bucket_array->size()作为循环条件是完全错误的:

  • bucket_array是std::list<std::string>类型的数组,bucket_array->size()取的是数组第一个list的元素数量,并非数组本身的长度。
  • 数组的实际长度存储在bucket_array_size成员变量中,正确的循环条件应为i < bucket_array_size(数组下标从0开始,到bucket_array_size-1结束)。

2. 迭代器失效问题

遍历list并调用erase(p)后,迭代器p会直接失效,后续执行++p会触发未定义行为。正确的写法是利用erase的返回值更新迭代器:

auto p = bucket_array[i].begin();
while (p != bucket_array[i].end()) {
    p = bucket_array[i].erase(p);
}

3. 多余的手动元素清理

实际上完全不需要手动遍历list删除元素,std::list的析构函数会自动清理自身所有元素。当执行delete[] bucket_array时,数组中的每个list对象都会自动调用析构函数完成清理工作,内层循环属于冗余操作。

最简修复后的析构函数

set::~set(){
    delete[] bucket_array;
}

如果坚持要手动清理(无必要但可验证),正确写法如下:

set::~set(){
    for (size_t i = 0; i < bucket_array_size; ++i) {
        auto p = bucket_array[i].begin();
        while (p != bucket_array[i].end()) {
            p = bucket_array[i].erase(p);
        }
    }
    delete[] bucket_array;
}

内容的提问来源于stack exchange,提问作者METRTHECAR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 18:24:25