这是什么问题 free(): invalid next size (fast)

时间:2021-08-18 10:42:57
这两天些程序,用new创建一个char数组,然后delete掉,编译器报错free(): invalid next size (fast)。我网上查了查,感觉是因为越界操作的原因,因为担心是中间的某步操作非法,new出来后立刻delete,编译器还是报相同的错误,不知是什么原因?卡了一天了,诸位朋友赐教,谢谢先!
PS:new返回的有地址。。。 

24 个解决方案

#1


没代码,没真相,

#2


delete [] XXX
[] 加上了么?

#3


没代码,瞎猜

#4


引用 2 楼 wanghao111 的回复:
delete [] XXX
[] 加上了么?

一个可能是这个原因。
另一个可能:是否重复删除了?

#5


如果这两点都注意到了呢?

#6


引用 5 楼 qshhnkf 的回复:
如果这两点都注意到了呢?

就不能贴下代码?

#7


引用 5 楼 qshhnkf 的回复:
如果这两点都注意到了呢?

是否重载了全局的operator new?

#8


也没有,而且是个局部变量。
不是不贴代码,是代码太多了,中间调了几个函数,贴出来更麻烦。

#9


帖子中描述的象这样
char *myBuffer = new char[ size + 1 ];
delete [] myBuffer;
这样连着写,就会报错。

#10


你先判断一下,是否真的new成功了。
如果new成功了,没理由delete错误。

#11


引用 10 楼 kouwenlong 的回复:
你先判断一下,是否真的new成功了。
 如果new成功了,没理由delete错误。
是啊,所以我也很奇怪啊。。。

#12


引用 11 楼 qshhnkf 的回复:
引用 10 楼 kouwenlong 的回复:
你先判断一下,是否真的new成功了。
如果new成功了,没理由delete错误。

是啊,所以我也很奇怪啊。。。

你从新建一个工程,输入以上代码的话,绝对不可能错。

#13


引用 12 楼 kouwenlong 的回复:
引用 11 楼 qshhnkf 的回复:
 引用 10 楼 kouwenlong 的回复:
 你先判断一下,是否真的new成功了。
 如果new成功了,没理由delete错误。

 是啊,所以我也很奇怪啊。。。

 你从新建一个工程,输入以上代码的话,绝对不可能错。
同意!

#14


引用 10 楼 kouwenlong 的回复:
你先判断一下,是否真的new成功了。
如果new成功了,没理由delete错误。

什么编译器?这么厉害?
是否抛出了异常?
试用:

char *myBuffer = new (std::nothrow) char[ size + 1 ]; 
看看。

#15


一样的结果,而且这个问题不是常有的。
我在跑测试用例,有的可以顺利通过这段代码,有的不行。。。实在没辙了。。。

#16


引用楼主 qshhnkf 的回复:
这两天些程序,用new创建一个char数组,然后delete掉,编译器报错free(): invalid next size (fast)。


用vc6.0还是vs2008?申请和释放heap时最好统一,new了再delete会报错free()的?是不是哪用了malloc()?

#17


user want to write something
create success position 0x9127080
*** glibc detected *** ./nachos: free(): invalid next size (fast): 0x09127080 ***
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6[0xb7d57604]
/lib/tls/i686/cmov/libc.so.6(cfree+0x96)[0xb7d595b6]
/usr/lib/libstdc++.so.6(_ZdlPv+0x21)[0xb7f3a231]
/usr/lib/libstdc++.so.6(_ZdaPv+0x1d)[0xb7f3a28d]
运行时报错,上面两行是测试是的输出

#18


引用 16 楼 lovewanghongchao 的回复:
引用楼主 qshhnkf 的回复:
 这两天些程序,用new创建一个char数组,然后delete掉,编译器报错free(): invalid next size (fast)。


 用vc6.0还是vs2008?申请和释放heap时最好统一,new了再delete会报错free()的?是不是哪用了malloc()?
linux gcc编译

#19


引用 15 楼 qshhnkf 的回复:
一样的结果,而且这个问题不是常有的。
我在跑测试用例,有的可以顺利通过这段代码,有的不行。。。实在没辙了。。。


那我只能说:这种错误主要是因为指针越界造成的!
检查有无 指针越界的可能性吧。

#20


但是无操作删除会报错该怎么解释呢?这点实在想不明白。。。

#21


找到问题了,不过感觉是系统内存分配的问题啊。。。
我定义了一个类
class A{
//方法略
private:
    File *a;//File为自定义类
    char *name;
    int count;
}

然后构造函数
A::A( char *fileName ){
    int size = sizeof( fileName );
    name = new char[ size + 1 ];
}

之后我又new了另外一个类的对象b,立刻输出A::name(正确的应该为../test/test_f0)发现尾部字符被冲,于是检查name的地址与b的首地址距离太近。
不知这是系统问题还是程序问题?

还有,之前的内存越界错误为何会在后续的内存操作中反应出来?

#22


贴代码、

#23


疯了~~~strlen用成了sizeof,哎~~~

#24


引用 23 楼 qshhnkf 的回复:
疯了~~~strlen用成了sizeof,哎~~~


狂晕。。。

#1


没代码,没真相,

#2


delete [] XXX
[] 加上了么?

#3


没代码,瞎猜

#4


引用 2 楼 wanghao111 的回复:
delete [] XXX
[] 加上了么?

一个可能是这个原因。
另一个可能:是否重复删除了?

#5


如果这两点都注意到了呢?

#6


引用 5 楼 qshhnkf 的回复:
如果这两点都注意到了呢?

就不能贴下代码?

#7


引用 5 楼 qshhnkf 的回复:
如果这两点都注意到了呢?

是否重载了全局的operator new?

#8


也没有,而且是个局部变量。
不是不贴代码,是代码太多了,中间调了几个函数,贴出来更麻烦。

#9


帖子中描述的象这样
char *myBuffer = new char[ size + 1 ];
delete [] myBuffer;
这样连着写,就会报错。

#10


你先判断一下,是否真的new成功了。
如果new成功了,没理由delete错误。

#11


引用 10 楼 kouwenlong 的回复:
你先判断一下,是否真的new成功了。
 如果new成功了,没理由delete错误。
是啊,所以我也很奇怪啊。。。

#12


引用 11 楼 qshhnkf 的回复:
引用 10 楼 kouwenlong 的回复:
你先判断一下,是否真的new成功了。
如果new成功了,没理由delete错误。

是啊,所以我也很奇怪啊。。。

你从新建一个工程,输入以上代码的话,绝对不可能错。

#13


引用 12 楼 kouwenlong 的回复:
引用 11 楼 qshhnkf 的回复:
 引用 10 楼 kouwenlong 的回复:
 你先判断一下,是否真的new成功了。
 如果new成功了,没理由delete错误。

 是啊,所以我也很奇怪啊。。。

 你从新建一个工程,输入以上代码的话,绝对不可能错。
同意!

#14


引用 10 楼 kouwenlong 的回复:
你先判断一下,是否真的new成功了。
如果new成功了,没理由delete错误。

什么编译器?这么厉害?
是否抛出了异常?
试用:

char *myBuffer = new (std::nothrow) char[ size + 1 ]; 
看看。

#15


一样的结果,而且这个问题不是常有的。
我在跑测试用例,有的可以顺利通过这段代码,有的不行。。。实在没辙了。。。

#16


引用楼主 qshhnkf 的回复:
这两天些程序,用new创建一个char数组,然后delete掉,编译器报错free(): invalid next size (fast)。


用vc6.0还是vs2008?申请和释放heap时最好统一,new了再delete会报错free()的?是不是哪用了malloc()?

#17


user want to write something
create success position 0x9127080
*** glibc detected *** ./nachos: free(): invalid next size (fast): 0x09127080 ***
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6[0xb7d57604]
/lib/tls/i686/cmov/libc.so.6(cfree+0x96)[0xb7d595b6]
/usr/lib/libstdc++.so.6(_ZdlPv+0x21)[0xb7f3a231]
/usr/lib/libstdc++.so.6(_ZdaPv+0x1d)[0xb7f3a28d]
运行时报错,上面两行是测试是的输出

#18


引用 16 楼 lovewanghongchao 的回复:
引用楼主 qshhnkf 的回复:
 这两天些程序,用new创建一个char数组,然后delete掉,编译器报错free(): invalid next size (fast)。


 用vc6.0还是vs2008?申请和释放heap时最好统一,new了再delete会报错free()的?是不是哪用了malloc()?
linux gcc编译

#19


引用 15 楼 qshhnkf 的回复:
一样的结果,而且这个问题不是常有的。
我在跑测试用例,有的可以顺利通过这段代码,有的不行。。。实在没辙了。。。


那我只能说:这种错误主要是因为指针越界造成的!
检查有无 指针越界的可能性吧。

#20


但是无操作删除会报错该怎么解释呢?这点实在想不明白。。。

#21


找到问题了,不过感觉是系统内存分配的问题啊。。。
我定义了一个类
class A{
//方法略
private:
    File *a;//File为自定义类
    char *name;
    int count;
}

然后构造函数
A::A( char *fileName ){
    int size = sizeof( fileName );
    name = new char[ size + 1 ];
}

之后我又new了另外一个类的对象b,立刻输出A::name(正确的应该为../test/test_f0)发现尾部字符被冲,于是检查name的地址与b的首地址距离太近。
不知这是系统问题还是程序问题?

还有,之前的内存越界错误为何会在后续的内存操作中反应出来?

#22


贴代码、

#23


疯了~~~strlen用成了sizeof,哎~~~

#24


引用 23 楼 qshhnkf 的回复:
疯了~~~strlen用成了sizeof,哎~~~


狂晕。。。