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

qshhnkf 2009-12-18 06:08:53
这两天些程序,用new创建一个char数组,然后delete掉,编译器报错free(): invalid next size (fast)。我网上查了查,感觉是因为越界操作的原因,因为担心是中间的某步操作非法,new出来后立刻delete,编译器还是报相同的错误,不知是什么原因?卡了一天了,诸位朋友赐教,谢谢先!
PS:new返回的有地址。。。
...全文
2574 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
qshhnkf 2009-12-19
  • 打赏
  • 举报
回复
疯了~~~strlen用成了sizeof,哎~~~
  • 打赏
  • 举报
回复
贴代码、
困了你就睡 2009-12-19
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 qshhnkf 的回复:]
疯了~~~strlen用成了sizeof,哎~~~
[/Quote]

狂晕。。。
qshhnkf 2009-12-19
  • 打赏
  • 举报
回复
找到问题了,不过感觉是系统内存分配的问题啊。。。
我定义了一个类
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的首地址距离太近。
不知这是系统问题还是程序问题?

还有,之前的内存越界错误为何会在后续的内存操作中反应出来?
qshhnkf 2009-12-18
  • 打赏
  • 举报
回复
但是无操作删除会报错该怎么解释呢?这点实在想不明白。。。
「已注销」 2009-12-18
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 qshhnkf 的回复:]
一样的结果,而且这个问题不是常有的。
我在跑测试用例,有的可以顺利通过这段代码,有的不行。。。实在没辙了。。。
[/Quote]

那我只能说:这种错误主要是因为指针越界造成的!
检查有无指针越界的可能性吧。
qshhnkf 2009-12-18
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 lovewanghongchao 的回复:]
引用楼主 qshhnkf 的回复:
这两天些程序,用new创建一个char数组,然后delete掉,编译器报错free(): invalid next size (fast)。


用vc6.0还是vs2008?申请和释放heap时最好统一,new了再delete会报错free()的?是不是哪用了malloc()?
[/Quote]linux gcc编译
qshhnkf 2009-12-18
  • 打赏
  • 举报
回复
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]
运行时报错,上面两行是测试是的输出
困了你就睡 2009-12-18
  • 打赏
  • 举报
回复
[Quote=引用楼主 qshhnkf 的回复:]
这两天些程序,用new创建一个char数组,然后delete掉,编译器报错free(): invalid next size (fast)。
[/Quote]

用vc6.0还是vs2008?申请和释放heap时最好统一,new了再delete会报错free()的?是不是哪用了malloc()?
qshhnkf 2009-12-18
  • 打赏
  • 举报
回复
一样的结果,而且这个问题不是常有的。
我在跑测试用例,有的可以顺利通过这段代码,有的不行。。。实在没辙了。。。
「已注销」 2009-12-18
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 kouwenlong 的回复:]
你先判断一下,是否真的new成功了。
如果new成功了,没理由delete错误。

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

char *myBuffer = new(std::nothrow) char[ size + 1 ];
看看。
qshhnkf 2009-12-18
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 kouwenlong 的回复:]
引用 11 楼 qshhnkf 的回复:
引用 10 楼 kouwenlong 的回复:
你先判断一下,是否真的new成功了。
如果new成功了,没理由delete错误。

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

你从新建一个工程,输入以上代码的话,绝对不可能错。
[/Quote]同意!
kouwenlong 2009-12-18
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 qshhnkf 的回复:]
引用 10 楼 kouwenlong 的回复:
你先判断一下,是否真的new成功了。
如果new成功了,没理由delete错误。

是啊,所以我也很奇怪啊。。。
[/Quote]
你从新建一个工程,输入以上代码的话,绝对不可能错。
qshhnkf 2009-12-18
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 kouwenlong 的回复:]
你先判断一下,是否真的new成功了。
如果new成功了,没理由delete错误。

[/Quote]是啊,所以我也很奇怪啊。。。
kouwenlong 2009-12-18
  • 打赏
  • 举报
回复
你先判断一下,是否真的new成功了。
如果new成功了,没理由delete错误。
qshhnkf 2009-12-18
  • 打赏
  • 举报
回复
帖子中描述的象这样
char *myBuffer = new char[ size + 1 ];
delete [] myBuffer;
这样连着写,就会报错。
qshhnkf 2009-12-18
  • 打赏
  • 举报
回复
也没有,而且是个局部变量。
不是不贴代码,是代码太多了,中间调了几个函数,贴出来更麻烦。
「已注销」 2009-12-18
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 qshhnkf 的回复:]
如果这两点都注意到了呢?
[/Quote]
是否重载了全局的operator new?
kouwenlong 2009-12-18
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 qshhnkf 的回复:]
如果这两点都注意到了呢?
[/Quote]
就不能贴下代码?
qshhnkf 2009-12-18
  • 打赏
  • 举报
回复
如果这两点都注意到了呢?
加载更多回复(4)

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧