内存越界 corrupted double-linked list

1.问题函数:

修改前:

/**
 * 根据频率重采样给定的样本数据
 *
 * @param samples 原始样本数据数组
 * @param resampling_n 重采样后的样本数量
 * @param frequency 目标频率
 * @param sampling_rate 原始样本数据的采样率
 * @return 存储重采样后样本数据的数组
 *
 * 本函数通过线性插值方法,根据目标频率对原始样本数据进行重采样
 */
    static std::vector<double>
    frequencyResample(const double *samples,int resampling_n, double frequency, double sampling_rate) {

        std::vector<double> resampleData;

        // 目标采样间隔 (秒)
        const double T_NEW = 1.0 / (frequency * samples.size());

        //原始数据采样间隔(秒)
        double Ts = 1.0 / sampling_rate;

        for (int n = 0; n < resampling_n; ++n) {
            // 计算目标采样点的时间
            double t_new = n * T_NEW;

            // 找到最近的原始采样点索引
            int k = static_cast<int>(std::floor(t_new / Ts));

            // 计算插值比例因子
            double alpha = (t_new - k * Ts) / Ts;

            // 线性插值
            resampleData.emplace_back(samples.[k] + alpha * (samples.at[k + 1] - samples.at[k]));
        }

        return resampleData;
    }

修改后:

/**
 * 根据频率重采样给定的样本数据
 *
 * @param samples 原始样本数据数组
 * @param resampling_n 重采样后的样本数量
 * @param frequency 目标频率
 * @param sampling_rate 原始样本数据的采样率
 * @return 存储重采样后样本数据的数组
 *
 * 本函数通过线性插值方法,根据目标频率对原始样本数据进行重采样
 */
    static std::vector<double>
    frequencyResample(std::vector<double> &samples,int resampling_n, double frequency, double sampling_rate) {

        std::vector<double> resampleData;

        // 目标采样间隔 (秒)
        const double T_NEW = 1.0 / (frequency * samples.size());

        //原始数据采样间隔(秒)
        double Ts = 1.0 / sampling_rate;

        for (int n = 0; n < resampling_n; ++n) {
            // 计算目标采样点的时间
            double t_new = n * T_NEW;

            // 找到最近的原始采样点索引
            int k = static_cast<int>(std::floor(t_new / Ts));

            // 计算插值比例因子
            double alpha = (t_new - k * Ts) / Ts;

            // 线性插值
            resampleData.emplace_back(samples.at(k) + alpha * (samples.at(k + 1) - samples.at(k)));
        }

        return resampleData;
    }

2.产生原因

由于通过Sample数组的[]运算符对k+1元素进行访问虽然在业务逻辑上是一种错误的调用方法,但是从技术角度分析由于ptmalloc的分配器分配方式下一位置会保存其它相邻空闲内存的指针,因此当再次访问相邻变量并希望在栈上分配空间时会引发错误。

3.查找思路

通过不断调试发现每次异常都在执行到相同的上下文产生,由于除了这几个函数没有其它通过裸指针访问内存的情况,因此逐行排查出此问题

4.问题复现与解决

通过修改传入参数由指针改为使用std::vector<double> 并在之后的访问中通过调用.at()方法来访问vector,触发了std::out_of_range_error验证了猜想。

posted @ 2025-04-19 16:29  BlackSnow  阅读(322)  评论(0)    收藏  举报