繁体   English   中英

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

[英]bad_alloc error when using std::string

我目前正在开发一个项目,该项目依赖于我提供文件路径(例如C:\\Path.pth )。 现在,我昨天通过调用我的std::string使一切正常:

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

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

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

任何帮助将非常感激


皮埃尔·伯德

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

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

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

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

简而言之,你做了一些会弄乱内存管理布局的东西(即所分配的块之间的所有这些信息)。 检查此次通话会发生什么。

该bug已被发现并修复。

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

不要忘记,你应该在路径中使用正斜杠,甚至在窗口上:

[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”是一个“alert”,“\\ 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

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

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM