3

我目前正在开发一个依赖于我提供文件路径的项目(例如。C:\Path.pth)。现在,我昨天打电话给我std::string,一切正常:

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

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

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

任何帮助将非常感激


皮埃尔BdR

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

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

4

7 回答 7

6

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

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

简而言之,您所做的事情会打乱内存管理布局(即所有这些信息都在分配的块之间)。检查此呼叫之前发生的情况。

于 2008-10-07T10:19:38.090 回答
3

该错误已被发现并修复。

似乎 TinyXML 在与TIXML_USE_STL定义一起使用时存在错误。因此,由于某种原因,构造函数TiDocument严重损坏了我的内存布局,以至于std::string我定义的下一个必须抛出bad_alloc异常 - 幸运的是,正好在字符串的第 4 个字符上,在我的情况下是 '\',结果在一个相当微妙的错误中。

于 2008-10-07T12:17:19.693 回答
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”是换行符,“\b”是退格,“\t”是制表符,“\a”是“alert”、“\v”是一个垂直制表符等。因此文件名“\version\next\alpha\beta\test.dat”被解释为一堆非常有趣的字符。为了安全起见,请改用“/version/next/alpha/beta/test.dat”,即使在使用“\”作为目录分隔符的系统上也是如此。这是因为这些操作系统上的库例程可以互换地处理“/”和“\”。

当然,您可以使用“\\version\\next\\alpha\\beta\\test.dat”,但这可能会伤害您(您会忘记其中一个“\”的可能性非零,a相当微妙的错误,因为大多数人没有注意到它)并且它无法帮助您(使用“\”而不是“/”没有任何好处)。此外,“/”更便于移植,因为它适用于所有风格的 Unix、Plan 9、Inferno、所有 Windows、OS/2 等,但“\”仅适用于该列表的一个子集。所以“\”会让你付出一些代价,却什么也得不到:改用“/”。

(来自C++ FAQ Lite

于 2008-10-07T14:05:59.693 回答
0

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

于 2008-10-07T09:18:37.713 回答
0

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

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

你昨天可能做了一个正斜杠,它也可以在这种情况下工作。

std::string path("c:/path.pth");
于 2008-10-07T09:19:26.807 回答
0

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

于 2019-10-14T14:30:38.023 回答
-1

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

Vista默认不会让你写入C盘根目录。尝试以下方法之一:

  • 关闭 UAC,或
  • 以“管理员”身份运行您的应用程序,或
  • 写入子目录。
于 2008-10-07T10:09:01.827 回答