free():多次调用后下一个大小(快速)无效
free(): invalid next size (fast) after several calls
我完全不确定这个函数怎么可能在内存分配方面有错误。
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;
}
问题出在您的一个循环中。正如这篇文章中所说错误:free((:无效的下一个大小(快速(:
您可能会溢出缓冲区或以其他方式写入不应写入的内存,从而导致堆损坏。
我最好的猜测是这个循环:
for (i=1, q=1; q; ++i) {
q0 = p[i];
p[i] += q;
q = q0;
}
如果数组p
未0
终止,这将覆盖堆中的内存。
话虽如此,如果您使用std::vector
而不是手动分配的数组,您的代码会更清晰。
相关文章:
- 重新定位图像时如何前进到下一个内存块
- C++: free(): 无效的下一个大小(快速)
- free():多次调用后下一个大小(快速)无效
- 将矢量<int>推入矢量<矢量<int>>时,SIGABRT - free():下一个大小无效(快速)
- free(): 无效的下一个大小 (快速): 0x0000000000f45160 ***.
- C 运行时错误:Free():下一个大小无效(快速)
- 释放内存失败:free():下一个大小无效(快速):
- free()错误:无效的下一个大小(fast)
- 有人能向我解释一下我的代码的哪一部分导致***检测到glibc***吗/a2:free():无效的下一个大小(快速)
- 内存错误: free(): 下一个大小无效 (快速)
- glibc 检测到 *** ./burcu.exe: free(): 无效的下一个大小 (快速): 0x00000000
- C++错误:Free()下一个大小无效(快速)
- **检测到glibc***/main:free():无效的下一个大小(fast):
- ***检测到glibc***..:free():无效的下一个大小(正常):..***fclose();之后;
- 错误glibc检测到free():无效的下一个大小(fast)
- C++错误消息free():下一个大小无效(快速)
- c++ free():无效的下一个大小(快速)
- free()下一个大小无效(快速)-C++内存错误
- Linux中的c++运行时错误::glibc检测到free():无效的下一个大小(快速):堆栈具有void ptr元素
- 如何找到错误: *** './a.out' 中的错误: free(): 无效的下一个大小 (快速): 0x09767150 ***