内存越界 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验证了猜想。

浙公网安备 33010602011771号