0

我有这个代码:

std::string ff = "C:\\res\\pp.txt";
std::ifstream test(ff);
if(test.is_open())
{
    std::string s;
    std::getline(test, s);

}

如果我在构造处放置一个断点并分析测试对象,它会被构造,但缓冲区是一个不正确的指针。然后,getline 崩溃,因为测试已损坏。

作为附带信息,此代码被执行到与一些库链接为gameplay3d 的项目中。

一些想法?

编辑:这是堆栈跟踪:

msvcp100d.dll!std::_Xfiopen(const char * filename, int mode, int prot) Línea 85 C++ msvcp100d.dll!std::_Fiopen(const char * filename, int mode, int prot) Línea 94 + 0x11 Bytes C++ sample -browser.exe!std::basic_filebuf >::open(const char * _Filename, int _Mode, int _Prot) Línea 220 + 0x1d Bytes C++ sample-browser.exe!std::basic_ifstream >::basic_ifstream >(const std: :basic_string,std::allocator > & _Str, int _Mode, int _Prot) Linea 725 + 0x1f Bytes C++ sample-browser.exe!Audio3DSample::initialize() Linea 30 + 0x15 Bytes C++

在代码点击 _Xfiopen 之前,一切似乎都很好。此时,fp 没有创建,虽然创建了 ifstream,但内部文件缓冲区为空。如果我把这段代码放在另一个项目中它可以工作,更重要的是,构造函数调用的代码和堆栈是完全不同的。

4

2 回答 2

2

您对问题的描述听起来好像您正在使用一个标准 C++ 库的标头,但使用另一个不兼容实现的实现。在许多情况下,设置应该有链接失败,但不能防止在所有情况下都链接不兼容的库。我会验证标题是否与实际实现相匹配。

于 2013-09-15T14:36:06.600 回答
0

首先不要在 ifstream 中传递字符串,将其设为 const char* 类型。

 std::ifstream test(ff.c_str());
于 2013-09-15T13:56:03.480 回答