我反复为以下方法获取相同的错误异常。 AST.exe中0x77a8f4e1处的未处理异常:0xC0000005:访问冲突读取位置0x29919ed9。
bool package::write(char * buf, size_t size, const char *fname)
{
//makeDir(fname);
FILE * output = fopen(fname, "wb");//break point
if (output == NULL)//break point
{
perror("ERROR: ");
return false;
}
fwrite(buf, size, sizeof(char), output);
fclose(output);
return true;
}
它与fopen有关,我知道因为断点。但无论我做什么,它只会在四次使用时获得例外。我已经反复更改了fname,但它总是在第四次使用时崩溃。由于某些原因,在我点击" Break"后,我最终到了mlock.c的第345行。
我真的很感激帮助解决这个令人讨厌的错误问题。
答案 0 :(得分:1)
这是一个用C编写的简单完整示例,可以简单地转换为C ++,显示编写函数的正确方法。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int write( char * buffer, size_t bytes, const char * name )
{
FILE * output = fopen( name, "wb");
if ( !output )
{
perror( "ERROR" );
return 0;
}
fwrite( buffer, sizeof( char ), bytes, output);
fclose( output );
return 1;
}
int main( )
{
write( "Hello world!", strlen( "Hello world!" ), "output.txt" );
return 0;
}
您使用错误的参数顺序调用fwrite()
。第二个参数是要写入缓冲区的每个元素的大小(以字节为单位)。第3个参数是要写入缓冲区的元素总数。有关参考,请参阅fwrite()
。
使用fwrite()
创建文件时,您应指定扩展名。否则,系统将创建泛型类型的文件。
在将字符串作为参数传递给perror()
之后添加冒号和空格是没有必要的。函数会为您执行此操作。有关参考,请参阅perror()
答案 1 :(得分:0)
解决问题。
编写一个连续四次调用函数的程序。如果这没有失败,那么你就知道问题出在其他地方。
您可以将更多原始程序添加到测试程序中,也可以开始减去原始程序的各个部分。首先备份它,或者将其提交给源代码控制。
如果你的行为如此奇怪,就像这似乎正在做的那样,问题就很可能完全不同了。您的程序可能正在写入它不拥有的内存。例如,如果程序的一部分持有指向对象的指针并且该对象被删除,然后mlock分配并重用该内存 AND THEN ,则程序使用该旧指针,它将写入mlock信息导致崩溃。