1

これでC++について私が気付いていない明らかな何かがあるに違いありません。

load(string & filename){

 string command;
 char delimiter = '/';
 size_t delimiterPos = filename.rfind(delimiter);
 string directory = string(filename.c_str(),delimiterPos);
 command = "import path ";

  //want to add directory to end of command
  string temp = command + "hello!"; // This works
  command.append(directory); //This works!
  command += directory;  //This seg faults!
  ...
}

関数の先頭でファイル名を「出力」すると、GDB で次のようになります: (const string &) @0x9505f08: {static npos = 4294967295, _M_dataplus = {> = {<__gnu_cxx::new_allocator> = {}, }, _M_p = 0x950a8e4 "../config/pythonFile.py"}}

一体、.append() が機能し、+= が機能しないように、ファイル名が正しくフォーマットされていないのはどうしてですか?! C++ のオーバーロードされた関数 += に奇妙な点がありますか?

g++ バージョン 3.4.6

4

2 に答える 2

4

多分それはあなたがここで「ディレクトリ」を構築している方法と関係があります

 size_t delimiterPos = filename.rfind(delimiter);
 string directory = string(filename.c_str(),delimiterPos);

rfindはどういうわけか失敗していますか?rfindが失敗した場合、ここで指定されているようにstd::nposを返します。nposを文字列コンストラクターに渡した場合の動作はわかりません。プラットフォームに依存する場合があります。

これは、「追加」が機能し、「+=」がクラッシュする理由には答えません。また、ある種のヒープの破損が発生している可能性があり(おそらく、上記のコンストラクターに渡されたnposおよびC文字列が原因)、+=が呼び出されたときに新しいメモリを割り当てる必要があります。何らかの理由で新しいメモリを割り当てる必要がない場合に追加します。

いずれにせよ、nposのチェックを追加するのが賢明です。

于 2009-05-13T17:48:51.757 に答える
1

問題を再現できません。以下のファイルは、g++ でここで動作します。

#include <string>
#include <iostream>

using namespace std;

int main(int, char**)
{
 string filename("a/b/c/d");

 string command;
 char delimiter = '/';
 size_t delimiterPos = filename.rfind(delimiter);
 string directory = string(filename.c_str(),delimiterPos);
 command = "import path ";

  //want to add directory to end of command
  string temp = command + "hello!"; // This works
  command.append(directory); //This works!
  cout << command << endl;

  command += directory;  //This seg faults!
  cout << command << endl;

}

出力:

$ g++ -o t t.cpp
$ ./t
import path a/b/c
import path a/b/ca/b/c
于 2009-05-13T17:42:46.823 に答える