c++ - free():多次调用后下一个大小无效(快速)
问题描述
我完全不确定这个函数怎么可能有内存分配错误。
template <typename T, typename U> // x -> ax+b
void transform_coords(double a, double b, int n, const T* oldc, U* newc) {
int i, j, q0, q;
if (n<2) return;
int *p = new int[n]; // Pascal's triangle
p[0] = 1;
for (i=1; i<n; ++i) p[i] = 0;
for (i=0; i<n; ++i) newc[i] = 0;
for (j=0; j<n; ++j) {
for (i=0; i<n; ++i) {
if (p[i]==0) break;
double m = p[i];
if (i!=j) m *= std::pow(a,j-i);
if (i!=0) m *= std::pow(b,i);
newc[i] += m * oldc[j];
}
for (i=1, q=1; q; ++i) {
q0 = p[i];
p[i] += q;
q = q0;
}
}
delete[] p;
}
在第三个电话我得到
*** glibc detected *** ./bin/bin_var: free(): invalid next size (fast)
如果我注释掉delete[] p;
它在所有调用中运行良好。
据我所知,关于内存分配,这个函数相当于
void transform_coords(int n) {
if (n<2) return;
int *p = new int[n];
delete[] p;
}
解决方案
问题出在您的一个循环中。正如这篇关于错误的帖子所说:免费():下一个大小无效(快速):
您可能正在溢出缓冲区或以其他方式写入不应写入的内存,从而导致堆损坏。
我最好的猜测是这个循环:
for (i=1, q=1; q; ++i) {
q0 = p[i];
p[i] += q;
q = q0;
}
如果p
数组没有0
终止,这将覆盖堆中的内存。
话虽如此,如果您使用std::vector
而不是手动分配的数组,您的代码会更清晰。
推荐阅读
- spring-boot - 在 Spring Boot 中用 @RestController 替换 @Controller 不会显示预期的视图
- python - 查找子列表的特定结果
- c# - 当我在 ASP.NET CORE Razor 中添加时,我在 ASP.NET 之外创建的 Html 和 Css 不适合
- wordpress - Wordpress 在简码中插入参数?
- sql - 从由开始行和结束行分隔的单个表中选择特定行
- excel - 通过 VBA 打开源工作簿时 VLookups 不更新
- php - 我如何将 MYSQL ROW_NUMBER OVER 与 MYSQL Server 而不是 MariaDB 一起使用
- spring - 春天不登录
- sql - 划分数据 - 缓存
- javascript - 反应无法内联更改按钮的背景颜色