1

const char *からNSStringを取得しようとしたときに、奇妙なバグが発生しました。

// in my obj c class
void myObjCMethod {
    const char* charString = myCFunctionReturningConstCharPtr(); 
    printf("%s \n", charString); // prints the correct string

    // ...put a brakpoint here... 

    NSString * nsString1 = [NSString stringWithUTF8String:charString];
    NSLog(@"%@", nsString1); // prints nothing

    NSString * nsString2 = [NSString stringWithFormat:@"%s",charString];
    NSLog(@"%@", nsString2); // prints nothing either
}

私のcメソッドからのconstcharは、コンソールにうまく出力されます。ただし、NSStringに変換しようとすると、文字列が空になります。ここで最も奇妙なことは、コードをデバッグしてブレークポイントを設定しようとすると(上記のように)、NSStringが突然有効になることです。

それで、何-私の測定は結果を変えますか?ずっと前の物理学の授業でおなじみのように聞こえますが、ここに量子力学が関係しているとは思えません。

ノート:

おそらく現在の問題とは関係のない複雑さの別の層を追加するため、今のところの実装を省略しましたmyCFunctionReturningConstCharPtr()(複数のc ++ライブラリが関係しており、文字列はcharポインタからstd :: stringに変換されています) 。

私はこれに2日間頭をぶつけてきました、どんな助けでも大歓迎です!ありがとう

編集:

文字列は、最初はSPODNodePowerVRのInsiderSDKの構造体から取得されます。そこにあります:

struct SPODNode {
    PVRTchar8 *pszName;
    // ...
}

と:

typedef char PVRTchar8;

私のコードでは、次のことを行います。

std::string MyCppClass::pvrNodeName() {
    if (node && node->pszName) {
        string stdName(node->pszName);
        return stdName;
    }
    return string();
}

そして最後にmyCFunctionReturningConstCharPtr()

const char * myCFunctionReturningConstCharPtr() {
    std::string stdString = myCppClassInstace->pvrNodeName()
    return stdString.c_str();
}

お役に立てば幸いです。

4

1 に答える 1

4

const char *は、std :: stringで.c_str()を呼び出すことによって取得されます。

関数から戻るときに割り当てが解除される文字の配列へのポインタを返すため、プログラムに未定義動作がある可能性が非常に高くなりますmyCFunctionReturningConstCharPtr()

実際、ローカルオブジェクトconst char*によってカプセル化された文字配列へのポイントを返します。std::stringオブジェクトのデストラクタはstd::stringその配列の割り当てを解除し、ローカルオブジェクトがスコープから外れたとき、つまり関数から戻ったときにデストラクタが呼び出されます。

後で受け取ったポインタを逆参照しようとすると、未定義動作になります。これは、何かが発生する可能性があることを意味します。これには、デバッグ時にプログラムが正常に実行されているように見えるが、デバッガーを接続せずに実行している場合には実行されないように見えることが含まれます。

カプセル化されたC文字列を取得する必要がある場合は、関数が(値ごとに)を返し、その戻り値std::stringを呼び出す必要があります。c_str()

std::string charString = myCFunctionReturningConstCharPtr(); 
printf("%s \n", charString.c_str()); // prints the correct string
于 2013-03-24T12:34:24.307 に答える