3

私は現在、ファイルへのパスを提供することに依存するプロジェクトに取り組んでいます(例C:\Path.pth)。さて、昨日は次の電話をかけてすべてが機能std::stringしました。

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

しかし、今では機能しません。をスローしbad_allocます。' \'文字が問題のようです。\x5C代わりにASCII値として使用してみましたが、同じ結果になりました。

#defineさて、私の質問は、これを引き起こした可能性のあるいくつかの、いくつかのコンパイラオプション、または他の「非コード」を台無しにした可能性がありますか?VS2005を使用しています。

どんな助けでも大歓迎です


PierreBdR

..それは非常にありそうに聞こえます。または少なくとも、それは: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」を使用することもできますが、それはあなたを傷つける可能性があります (「\」の 1 つを忘れる可能性はゼロではありません。ほとんどの人は気付かないので、かなり微妙なバグです) そして、それはあなたを助けることはできません (「/」ではなく「\」を使用する利点はありません)。また、"/" は、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 に答える