2009-05-13 24 views
1

C++についてはわかりません。 GDBで+ =を文字列で使用するとエラーが発生する

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! 
    ... 
} 

ときに私私が取得関数の先頭で "印刷" ファイル名:0x9505f08 @ (定数文字列&):{静的のNPO = 4294967295、 _M_dataplus = {> = {< __gnu_cxx :: .append()が動作し、+ =が正しく動作しないようなファイル名のフォーマットはどうですか? ?!オーバーロードされた関数で奇妙な何か+ = C++で?

g ++バージョン3.4.6

+1

+ =関数の演算子に壊れて、実際にどの行が衝突しているかを確認します。 –

+0

appendと+ =の呼び出しの順序を逆にするとどうなりますか?それとも、一度に1つずつ試していたのですか? –

+0

@harperは+ =で死んで、決して.appendに行きません – Alex

答えて

4

たぶんそれはどのようにあなたがここに "ディレクトリ" を構築している

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

がRFINDが何らかの形で失敗しているとしなければなりませんか? rfindが失敗した場合、指定されたstd :: nposが返されます。here私はあなたが文字列コンストラクタにnposを渡した場合の動作がどうなるか分かりません。プラットフォームに依存する可能性があります。

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

いずれにしても、nposのチェックを追加することをおすすめします。

+0

私はあなたが正しいかもしれないと思う、私はvalgrindを使用してメモリの破損を追跡しようとしています。 – Alex

+0

あなたはクッキーに勝ちます。文字列の1つがライブラリに正しく割り当てられていませんでした。 + =がヒープを割り当てて、明らかに問題を引き起こしているという事実。 – Alex

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