内存错误: free(): 下一个大小无效 (快速)
Memory error: free(): invalid next size (fast)
我正在尝试实现一个radix sort
,并且此代码产生内存故障:
(free(): invalid next size (fast))
代码如下:
unsigned int * radix(unsigned int *x,int n, int g,bool verbose)
{
int elem_size = sizeof(unsigned int)*8;
int mask = ((1<<g)-1);
float num_rounds= ((float)elem_size/(float)g);
int B = 1 << g; // 2^g BTW
vector<unsigned int> buckets[B];
// begin radix sort
for( unsigned int round=0 ; round<num_rounds ; ++round)
{
// count
for(int elem=0 ; elem<n ; ++elem)
{
// calculate the bucket number:
unsigned int const bucket_num = ( x[elem] >> g*round) & mask;
---> buckets[bucket_num].push_back(x[elem]);
}
// more stuff
}
return x;
}
GDB
指出错误在push_back内部,但elem
始终小于n
(其中n
是x[]
的大小(。所以,我认为它只能在bucket_num
.然而,就在它崩溃之前,GDB
给了我他们的值:
Breakpoint 1, radix (x=0x604010, n=50, g=4, verbose=true) at radix.mpi.seq.cpp:38 38 buckets[bucket_num].push_back(x[elem]); 2: B = 16 1: bucket_num = 2
有什么想法吗?
从您的评论中可以清楚地看出:访问unsigned int *x
是在radix
函数中访问它时出现无效写入错误的原因。
unsigned int *x = new unsigned int(n);
分配单个无符号 int 并将值n
分配给它。你真的想要一个无符号的整数数组: unsigned int *x = new unsigned int[n];
通常,运行Valgrind有助于找到内存泄漏以及问题的确切位置。因为,通常您收到的错误消息几乎不会发生在似乎发生的行中。
相关文章:
- 大量序列中核苷酸类型的快速计数
- 为什么比较运算符如此快速
- Openssl 1.1.1d无效使用不完整的类型"struct dsa_st"
- C++: free(): 无效的下一个大小(快速)
- free():多次调用后下一个大小(快速)无效
- 将矢量<int>推入矢量<矢量<int>>时,SIGABRT - free():下一个大小无效(快速)
- free(): 无效的下一个大小 (快速): 0x0000000000f45160 ***.
- C 运行时错误:Free():下一个大小无效(快速)
- 释放内存失败:free():下一个大小无效(快速):
- 有人能向我解释一下我的代码的哪一部分导致***检测到glibc***吗/a2:free():无效的下一个大小(快速)
- glibc 检测到 free() 无效大小(快速)错误
- 内存错误: free(): 下一个大小无效 (快速)
- glibc 检测到 *** ./burcu.exe: free(): 无效的下一个大小 (快速): 0x00000000
- C++错误:Free()下一个大小无效(快速)
- C++错误消息free():下一个大小无效(快速)
- c++ free():无效的下一个大小(快速)
- free()下一个大小无效(快速)-C++内存错误
- Linux中的c++运行时错误::glibc检测到free():无效的下一个大小(快速):堆栈具有void ptr元素
- 如何找到错误: *** './a.out' 中的错误: free(): 无效的下一个大小 (快速): 0x09767150 ***
- free(): Cpp中下一个大小(快速)无效