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



我目前正在处理一个项目,该项目依赖于我提供文件的路径(例如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,或
  • 以"管理员"身份运行您的应用程序,或者
  • 写入子目录

相关内容

  • 没有找到相关文章

最新更新