您的位置:首页 > 其它

可能是堆被损坏,这也说明 XX.exe 中或它所加载的任何 DLL 中有 bug

2013-08-19 21:04 225 查看
今天遇到一个很奇怪的问题,

当代码如下时:

char* s = (char*)malloc(20*sizeof(char));
string buffer;
const char* conchar;
char* p;
double x = 0.01;
while(getline(file,buffer)){
const int len = buffer.length();
conchar = buffer.c_str();//m_conchar为const char *
strcpy(s,conchar);//换成char*

cout<<x<<endl;
}

上述不是我完整的程序,cout是实例,就是每次运行到cout只要输出是小数都会出错,而int类型啥的都不出错。

当工程设置运行库“多线程DLL(MD)”

XXX.exe 中的 0x7707e4e4 (ntdll.dll) 处有未经处理的异常: 0xC0000005: 写入位置 0x0000000000000024 时发生访问冲突

当工程设置运行库“多线程调试DLL(MDd)”

只要是cout或者file.close()或者free(s)都会出现

其原因可能是堆被损坏,这也说明 XX.exe 中或它所加载的任何 DLL 中有 bug

/article/11039945.html

但是感觉这些都不适用,没有自己加载的dll。

之后一点一点注释,发现没有strcpy这个函数就不会崩溃,而加上之后在cout处还是会崩溃,每次出错都在C的运行时库,后来把代码改成了

//char* s= (char*)malloc(20*sizeof(char));
string buffer;
//const char* conchar;
char* p;
double x = 0.01;
while(getline(file,buffer)){
const int len = buffer.length();
char* s = new char[len];
strcpy(s,buffer.c_str());
//conchar = buffer.c_str();//m_conchar为const char *
//strcpy(s,conchar);//换成char*
cout<<x<<endl;
//delete s;
}

这样可以顺利运行,但是delete的时候程序会有问题,这样就造成了内存泄露,很奇怪。

最后搞清楚了这种情况是越界了,所以free会出错,delete也会出错,/article/7797281.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐