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

时间:2008-10-07 09:15:34

标签: c++ exception stl stdstring

我目前正在开发一个依赖于我提供文件路径的项目(例如C:\Path.pth)。现在,我昨天通过调用我的std::string来完成所有工作:

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

但现在它不起作用。它会抛出一个bad_alloc。似乎'\'字符就是问题所在。我甚至尝试使用\x5C作为它的ascii值,但结果相同。

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

非常感谢任何帮助


PierreBdR

..听起来很可能。或者至少,它必须:P

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

7 个答案:

答案 0 :(得分:6)

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

所以要么你没有更多的内存(不太可能),要么你之前有某个缓冲区溢出(很可能在我看来)或其他一些内存问题,如双重免费。

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

答案 1 :(得分:3)

已找到并修复了该错误。

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

答案 2 :(得分:1)

不要忘记,你应该在路径中使用正斜杠,即使在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”是换行符,“\ n”是退格键,“\ t”是制表符,“\ a “是一个”警报“,”\ v“是一个垂直标签等。因此文件名”\ version \ next \ alpha \ beta \ test.dat“被解释为一堆非常有趣的字符。为了安全起见,请使用“/version/next/alpha/beta/test.dat”,即使在使用“\”作为目录分隔符的系统上也是如此。这是因为这些操作系统上的库例程可以互换地处理“/”和“\”。

     

当然你可以使用“\\ version \\ next \\ alpha \\ beta \\ test.dat”,但这可能会伤害你(你有一个非零的机会忘记其中一个“\” s,一个相当微妙的错误,因为大多数人都没有注意到它)并且它无法帮助你(使用“\”超过“/”没有任何好处)。此外,“/”更具可移植性,因为它适用于所有类型的Unix,Plan 9,Inferno,所有Windows,OS / 2等,但“\”仅适用于该列表的子集。所以“\”会花费你一些东西而不会获得任何东西:使用“/”代替。

(来自C++ FAQ Lite

答案 3 :(得分:0)

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

答案 4 :(得分:0)

不,你昨天也没有“正常工作”。 '\'需要像这样转义:

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

你昨天可能做了一次正斜杠,这也适用于这种情况。

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

答案 5 :(得分:0)

这可能仅仅是由于需要一个干净的版本;我经历过这种情况肯定是这样。

答案 6 :(得分:-1)

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

默认情况下,Vista不会让您写入C盘的根目录。请尝试以下方法之一:

  • 关闭UAC或
  • 以“管理员”或
  • 运行您的应用程序
  • 写入子目录。