我目前正在使用Visual Studio 2008将软件从32位移植到64位,我遇到了fread
的问题,这会导致在调用时导致段错误:
以下是重现此问题的代码示例:
void somefunction(std::string filepath)
{
FILE* myfile = fopen(filepath.c_str(),"rb"); // returns a valid handle
if (myfile)
{
char* buffer = new char[BUFFER_SIZE+1];
memset(buffer,0,BUFFER_SIZE+1);
fread(buffer,1,BUFFER_SIZE,myfile); // segfault happens here
fclose(f);
}
}
GetError
和ferror
不报告任何错误,并且在编译32位时可以读取文件。它虽然在64位上输入fread
时总是会触发段错误。
我已尝试过其他几种文件阅读方法(使用ifstream
和Qt' QFile
)并且它们有效。
不幸的是,fread
在代码中的许多其他地方使用,我想知道在改变使用它的每一段代码之前是否有一些特殊的VS2008 64位实现。
提前致谢。
答案 0 :(得分:1)
好的家伙,我想我已经明白了。
似乎此问题与调试模式下的msvcrt链接有关。
fread调用位于链接到msvcrtd.lib的库中,而引发错误的可执行文件则链接到msvcrt。
我有点意外,这只会引起恐惧问题。 libc符号是否位于Windows下的msvcrt内?
无论如何,我目前正在清理我的链接标记。很抱歉没有能够发布更详细的代码示例。我们在非常严格的NDAs下工作,我没有想到这与链接标志有关^^'