2016-08-16 7 views
0

私は現在モジュラープログラムでdlopenを使用していますが、私は何かが間違っていると思いますが、わかりません。dlopenの後に間違った文字列ライブラリがありますか?

requirementDataは、VoidDataというクラスのベクターです。これは単純にvoid *を扱うクラスです。

getCopyOfData()は、void *に格納されたデータをコピーするためにmemcpyを使用します。ここまでは正常ですが、のアドレスvoidptrは私のVoidDataオブジェクトに格納されているものと異なり、コピーは成功しています。

今すぐ... 文字列Aは私に正しい文字列を与えます。これはの文字列Bでも問題ありません。しかし、ストリングCが来て、彼は私に奇妙な何かを与える。

void* voidptr = requirementData[0].getCopyOfData(); 

string stringA = *((string*) voidptr); 
cout << "VoidPtr: " << stringA << endl; // VoidPtr: 'SayHey' 

string stringB = *((string*) voidptr); 
cout << "VoidPtr: " << stringB << endl; // VoidPtr: 'SayHey' 

// load library 
void *handle = dlopen("/usr/lib64/libOpcWorkingPackage.so", RTLD_LAZY); 

string stringC = *((string*) voidptr); 
cout << "VoidPtr: " << stringC << endl; // VoidPtr: '����' 

私はまた、uint8_tの配列に voidptr をキャストしようとしました。配列は私に同じ32の数字を与えるたびに。

for (unsigned int i = 0; i < sizeof(stringC); i++){ 
    cout << to_string(((uint8_t*) voidptr)[i]) << ", "; 
} 
cout << endl; 
// 80, 181, 228, 245, 255, 127, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 83, 97, 121, 101, 119, 121, 0, 0, 0, 183, 228, 245, 255, 127, 49, 52 

私は多分、誰かが私を助けることができます。

おかげで、Narase

編集:

void* VoidData::getCopyOfData() const { 
    void *data = malloc(size); 
    memcpy(data, storedData, size); 
    return data; 
} 

編集:ここに私のgetCopyOfData()関数のそれは

私は取得データがchar []は手に入れました。このchar []は、それらをコピーしない文字列の中に置かれ、それにポインタを置くだけです。 char []が解放された後、文字列はそれ以降メモリが使用されるまで動作します

正しい考え方をありがとうございますuser4581301!

+1

'getCopyOfData'が必要です。ローカル変数へのポインタを返す可能性が非常に高い。 – user4581301

+0

私はそれを編集しました – Narase

+0

これはあなたの問題ではないのですが、stringA、stringB、およびstringCのすべての文字列が範囲外になるとvoidptrを解放しようとするため、コードにコードの匂いがあります。 dlopenが呼び出される前にコンパイラがstringA/stringBのデストラクタへの呼び出しを挿入している可能性があります。したがって、cout voidptrの最後の呼び出しで解放され(2回)、解放されたメモリを出力します。 –

答えて

0

取得するデータはchar []にあります。このchar []は、それらをコピーしない文字列(私のもの)に置かれ、それにポインタを置くだけです。 char []が解放された後、文字列はそれ以降メモリが使用されるまで動作します。

正解ありがとうございますuser4581301!

関連する問題