使用std::string时出现bad_alloc错误

3

我目前正在进行一个项目,需要我提供文件路径(例如:C:\Path.pth)。昨天,我通过调用我的std::string使一切正常:

std::string path(`"C:\\Path.pth`");

但现在它不起作用了。它会抛出一个"bad_alloc"异常。似乎是'\'字符的问题。我甚至尝试使用其ASCII值'\x5C',但结果相同。
现在,我的问题是,我是否可能已经弄错了一些"#define"、编译器选项或其他一些与代码无关的东西?我正在使用VS 2005。
非常感谢任何帮助。
PierreBdR
..听起来很有可能。或者至少,它必须:P
由于没有人提到某种/SetStringCharSize:2bit-编译器选项,我认为可以安全地假设我的代码必须在某个地方搞砸了什么,并且它不只是一个愚蠢的编译器选项(或类似的)出了问题。

如果你想显示一个双反斜杠,请选择包含它的部分并将其定义为代码。 - Burkhard
只是为了检查,您可以先将字符串分配给const char *,然后将其传递给字符串构造函数吗? - Dominik Grabiec
Meeh: 你能编辑一下标题吗?问题与字符串或反斜杠无关。 - user3458
7个回答

6

正如您的错误提示所示,问题是由于内存分配引起的(即bad_alloc异常)。

因此,要么您没有更多的内存(不太可能),要么在此之前某个地方存在缓冲区溢出(我认为很有可能),或者像双重释放这样的其他内存问题。

简而言之,您做了一些会搞乱内存管理布局的事情(即分配块之间的所有这些信息)。请检查此调用之前发生了什么。


3

已经找到并修复了该漏洞。

似乎在使用TIXML_USE_STL定义时,TinyXML存在一个漏洞。因此,TiDocument的构造函数会严重破坏我的内存布局,导致我定义的下一个std::string必须抛出bad_alloc异常 - 幸运的是,在字符串的第4个字符上发生了这种情况,即'\',导致一个相当微妙的错误。


很高兴你找到了问题所在。但是,“在字符串的第四个字符上抛出bad_alloc异常”这句话我不太理解。这对我来说毫无意义。 - Michael Burr
我同意...这对我也没有意义。实际上,我认为我在那一点上有些含糊不清 :)如果我执行了 std::string path = "C:\Test.xml",将会抛出 bad_alloc。如果我执行了 path = "C:Test.xml",就不会抛出 bad_alloc。所以不要问我它为什么会这样做 :P - Meeh

0

这可能仅仅是因为需要进行一次干净的构建; 当我遇到这种情况时,确实是这种情况。


0

将字符串定义为:"C:\\Path.pth"


0
不,你昨天也没有让它“运行”。反斜杠需要像这样转义:
std::string path("c:\\path.pth");

你可能昨天输入了一个正斜杠,这在这种情况下也可以使用。

std::string path("c:/path.pth");

0

别忘了,在路径中应该使用正斜杠,即使在Windows上也是如此:

[15.16] 为什么我无法打开不同目录中的文件,例如 "..\test.dat"?

因为 "\t" 是一个制表符。

您应该在文件名中使用正斜杠,即使在使用反斜杠的操作系统(DOS、Windows、OS/2等)上也是如此。例如:

#include <iostream>
#include <fstream>

int main()
{
  #if 1
    std::ifstream file("../test.dat");  // RIGHT!
  #else
    std::ifstream file("..\test.dat");  // WRONG!
  #endif

  ...
} 

记住,在字符串字面值中,反斜杠(“\”)用于创建特殊字符:“\n”是换行符,“\b”是退格符,“\t”是制表符,“\a”是“警报”,“\v”是垂直制表符等。因此,文件名“\version\next\alpha\beta\test.dat”被解释为一堆非常有趣的字符。为了安全起见,即使在使用“\”作为目录分隔符的系统上,也请改用“/version/next/alpha/beta/test.dat”。这是因为这些操作系统上的库例程可以互换处理“/”和“\”。
当然,你可以使用“\\version\\next\\alpha\\beta\\test.dat”,但那可能会伤害你(有一定的机会忘记其中一个“\”,这是一个相当微妙的错误,因为大多数人都没有注意到它),而且它对你没有帮助(使用“\”没有任何好处)。此外,“/”更具可移植性,因为它适用于所有版本的Unix、Plan 9、Inferno、所有Windows、OS/2等,但“\”仅适用于该列表的子集。因此,“\”会让你付出代价,却得不到任何好处:请改用“/”。

(来自C++ FAQ Lite


-1

假设你的双反斜杠是正确的,我猜测你在运行Vista操作系统?

Vista默认不允许你写入C盘的根目录。你可以尝试以下几种方法:

  • 关闭用户账户控制(UAC)
  • 以“管理员”身份运行你的应用程序
  • 写入一个子目录中

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接