2008-10-07 69 views
2

bad_alloc的错误:: string的

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

但现在它不工作:现在,我通过调用我std::string用了一切工作昨天。它会抛出一个bad_alloc。看起来像'\'字符是问题。我甚至尝试使用\x5C作为它的ascii值,而不是相同的结果。

现在,我的问题是,是否有可能已经搞砸了一些#define,一些编译器选项或其他可能导致这种情况的“非代码”?我使用VS 2005

任何帮助,将不胜感激


PierreBdR

..这听起来很容易。或者至少,它必须:P

由于没有人提到某种/ SetStringCharSize:2bit编译器选项,我认为可以安全地假设我的代码必须在某处搞乱某些东西,而且它不是只是一个愚蠢的编译器选项(或类似),这是错误的..

+0

如果要显示一个双抗斜线,选择包含它的其定义为代码的部分。 – Burkhard 2008-10-07 09:36:58

+0

只要检查一下,你可以先将字符串赋给一个const char *,然后把它传递给字符串构造函数? – Daemin 2008-10-07 10:20:32

+0

Meeh:你能编辑你的标题吗?该问题与字符串或反斜杠无关 – Arkadiy 2008-10-07 12:31:14

回答

0

定义字符串:“C:\\ Path.pth”

0

不,你没有拥有它的“工作”昨天无论是。 “\”需要转义像这样:

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

你大概昨天,它可以在这种情况下工作,以及做了一个斜杠。

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

假设你的双反斜杠是正确的,我猜你是在Vista上运行?

Vista将不会让你写入默认C盘的根目录下。请尝试以下之一:

  • 关闭UAC,或
  • 运行应用程序为“管理员”,或
  • 写入到子目录中。
6

如您的错误提示,问题归因于内存分配(即bad_alloc异常)。

因此,无论你有没有更多的内存(不太可能),或者你有在什么地方的缓冲区溢出(很可能在我看来)或类似双自由一些其他的内存问题。

总之,你做的东西弄乱了内存管理布局(即所有这些信息分配的块之间)。请检查之前这个电话。

3

该错误已找到并修复。

好像TinyXML的是有一个bug与TIXML_USE_STL定义中使用时。所以出于某种原因,TiDocument的构造函数破坏了我的内存布局,所以我定义的下一个std::string必须抛出bad_alloc异常 - 幸运的是,对于我来说,恰好在字符串的第4个字符处,在我的情况下是'\ ',导致一个相当微妙的错误。

1

不要忘了,你应该使用正斜杠的路径,即使是在Windows:

[15.16]为什么我不能开在不同的目录中的文件,如” .. \测试。 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

相关问题