PS:new返回的有地址。。。
24 个解决方案
#1
没代码,没真相,
#2
delete [] XXX
[] 加上了么?
[] 加上了么?
#3
没代码,瞎猜
#4
一个可能是这个原因。
另一个可能:是否重复删除了?
#5
如果这两点都注意到了呢?
#6
就不能贴下代码?
#7
是否重载了全局的operator new?
#8
也没有,而且是个局部变量。
不是不贴代码,是代码太多了,中间调了几个函数,贴出来更麻烦。
不是不贴代码,是代码太多了,中间调了几个函数,贴出来更麻烦。
#9
帖子中描述的象这样
char *myBuffer = new char[ size + 1 ];
delete [] myBuffer;
这样连着写,就会报错。
char *myBuffer = new char[ size + 1 ];
delete [] myBuffer;
这样连着写,就会报错。
#10
你先判断一下,是否真的new成功了。
如果new成功了,没理由delete错误。
如果new成功了,没理由delete错误。
#11
是啊,所以我也很奇怪啊。。。
#12
你从新建一个工程,输入以上代码的话,绝对不可能错。
#13
同意!
#14
什么编译器?这么厉害?
是否抛出了异常?
试用:
char *myBuffer = new (std::nothrow) char[ size + 1 ];
看看。
#15
一样的结果,而且这个问题不是常有的。
我在跑测试用例,有的可以顺利通过这段代码,有的不行。。。实在没辙了。。。
我在跑测试用例,有的可以顺利通过这段代码,有的不行。。。实在没辙了。。。
#16
用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]
运行时报错,上面两行是测试是的输出
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
linux gcc编译
#19
那我只能说:这种错误主要是因为指针越界造成的!
检查有无 指针越界的可能性吧。
#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的首地址距离太近。
不知这是系统问题还是程序问题?
还有,之前的内存越界错误为何会在后续的内存操作中反应出来?
我定义了一个类
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
狂晕。。。
#1
没代码,没真相,
#2
delete [] XXX
[] 加上了么?
[] 加上了么?
#3
没代码,瞎猜
#4
一个可能是这个原因。
另一个可能:是否重复删除了?
#5
如果这两点都注意到了呢?
#6
就不能贴下代码?
#7
是否重载了全局的operator new?
#8
也没有,而且是个局部变量。
不是不贴代码,是代码太多了,中间调了几个函数,贴出来更麻烦。
不是不贴代码,是代码太多了,中间调了几个函数,贴出来更麻烦。
#9
帖子中描述的象这样
char *myBuffer = new char[ size + 1 ];
delete [] myBuffer;
这样连着写,就会报错。
char *myBuffer = new char[ size + 1 ];
delete [] myBuffer;
这样连着写,就会报错。
#10
你先判断一下,是否真的new成功了。
如果new成功了,没理由delete错误。
如果new成功了,没理由delete错误。
#11
是啊,所以我也很奇怪啊。。。
#12
你从新建一个工程,输入以上代码的话,绝对不可能错。
#13
同意!
#14
什么编译器?这么厉害?
是否抛出了异常?
试用:
char *myBuffer = new (std::nothrow) char[ size + 1 ];
看看。
#15
一样的结果,而且这个问题不是常有的。
我在跑测试用例,有的可以顺利通过这段代码,有的不行。。。实在没辙了。。。
我在跑测试用例,有的可以顺利通过这段代码,有的不行。。。实在没辙了。。。
#16
用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]
运行时报错,上面两行是测试是的输出
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
linux gcc编译
#19
那我只能说:这种错误主要是因为指针越界造成的!
检查有无 指针越界的可能性吧。
#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的首地址距离太近。
不知这是系统问题还是程序问题?
还有,之前的内存越界错误为何会在后续的内存操作中反应出来?
我定义了一个类
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
狂晕。。。