fopen mlock访问违规

时间:2014-04-30 21:50:39

标签: c++ fopen

我反复为以下方法获取相同的错误异常。 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行。

我真的很感激帮助解决这个令人讨厌的错误问题。

2 个答案:

答案 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信息导致崩溃。