【问题标题】:fread fails with VS2008 64-bitsfread 使用 VS2008 64 位失败
【发布时间】:2014-04-09 07:55:15
【问题描述】:

我目前正在使用 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);
    }
}

GetErrorferror不报错,编译32位时可以读取文件。不过,在 64 位上输入 fread 时总是会触发段错误。

我尝试了其他几种文件读取方法(使用ifstream 和Qt 的QFile),它们都有效。

不幸的是,fread 在代码中的许多其他地方都使用了,我想知道它在 VS2008 64 位的实现中是否有一些特殊之处,然后再更改使用它的每一位代码。

提前致谢。

【问题讨论】:

  • 你能确认this sample from MSDN(实际上是C)不能在你的系统上运行吗?此外,您没有检查fread 的返回值。而且您不需要使用new 分配缓冲区。就做char buffer[BUFFER_SIZE+1];
  • 看不出这个函数本身有什么问题。你确定你没有在不同的功能中破坏某些东西,而它恰好在这个功能中崩溃了吗? [或者你的例子可能过于简单了?]
  • 我已经在各个领域发现了这个问题,但每次都是 fread 的罪魁祸首。由于此代码是封闭源代码产品的一部分,很遗憾我无法显示更大的代码示例:

标签: c++ visual-studio-2008 64-bit libc


【解决方案1】:

好吧,伙计们,我想我明白了。

似乎这个问题与调试模式下的 msvcrt 链接有关。

fread 调用位于与 msvcrtd.lib 链接的库中,而引发错误的可执行文件与 msvcrt 链接。

我有点惊讶这只会导致 fread 出现问题。 Windows 下的 libc 符号是否位于 msvcrt 内?

无论如何,我目前正在清理我的链接标志。很抱歉无法发布更详细的代码示例。我们在非常严格的保密协议下工作,我没想到这与链接标志有关^^'

【讨论】:

  • msvcrt 读取 Microsoft Visual C 运行时。所以是的,msvcrt(和特定于编译器版本的msvcr* 是“libc”。
猜你喜欢
  • 2012-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-24
  • 2019-01-05
  • 1970-01-01
  • 2018-05-02
  • 2012-11-15
相关资源
最近更新 更多