[英]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盘的根目录。 请尝试以下方法之一:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.