我目前正在处理一个项目,该项目依赖于我提供文件的路径(例如C:Path.pth
)。现在,我昨天用打电话给我的std::string
,一切都正常了
std::string path(`"C:\Path.pth`");
但现在它不起作用了。它抛出一个bad_alloc
。似乎""字符是问题所在。我甚至尝试使用
x5C
作为它的ascii值,但结果相同。
现在,我的问题是,是否可能是我搞砸了一些#define
、一些编译器选项或其他"非代码"导致了这种情况?我使用的是VS 2005。
如有任何帮助,将不胜感激
PierreBdR
这听起来很可能。或者至少,它必须:P
由于没有人提到过某种/SeStringCharSize:2bit编译器选项,我认为可以放心地假设我的代码必须在某个地方搞砸一些东西,而且这不仅仅是一个愚蠢的编译器选项(或类似选项)是错误的。。
正如您的错误所示,问题是由于内存分配(即bad_alloc异常)引起的。
所以,要么你没有更多的内存(不太可能),要么你之前的某个地方缓冲区溢出(在我看来很可能),或者其他一些内存问题,比如双倍空闲。
简而言之,您所做的事情会打乱内存管理布局(即,分配的块之间的所有这些信息)。检查在此呼叫之前发生的情况。
错误已经找到并修复。
TinyXML在与TIXML_USE_STL
定义一起使用时似乎有一个错误。因此,由于某种原因,TiDocument
的构造函数严重破坏了我的内存布局,以至于我定义的下一个std::string
不得不抛出bad_alloc
异常——幸运的是,正好在字符串的第4个字符上,在我的情况下是"\",这导致了一个相当微妙的错误。
将字符串定义为:"C:\\Path.pth"
不,你昨天也没有让它"工作"。'\'需要像这样逃脱:
std::string path("c:\path.pth");
你昨天可能做了一个正向斜杠,在这种情况下也可以。
std::string path("c:/path.pth");
别忘了,你应该在路径中使用斜杠,即使在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"。这是因为这些操作系统上的库例程可以互换地处理"/"one_answers"\"。
当然,你可以使用"\\version\\next\\alpha\\beta\\test.dat",但这可能会伤害你(你会忘记其中一个"\"的可能性为零,这是一个相当微妙的错误,因为大多数人都没有注意到它),它对你没有帮助(使用"\"而不是"/"没有好处)。此外,"/"更易于移植,因为它适用于Unix、Plan 9、Inferno、所有Windows、OS/2等的所有版本,但"\"仅适用于该列表的一个子集。所以"\"会让你付出一些代价,但不会给你带来任何收获:请使用"/"。
(来自C++FAQ Lite)
这可能只是因为需要一个干净的构建;当我经历这种情况时,情况确实如此。
假设你的双反斜杠是正确的,我猜你在Vista上运行?
默认情况下,Vista不会让您写入C驱动器的根目录。尝试以下操作之一:
- 关闭UAC,或
- 以"管理员"身份运行您的应用程序,或者
- 写入子目录