私は現在モジュラープログラムで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!
'getCopyOfData'が必要です。ローカル変数へのポインタを返す可能性が非常に高い。 – user4581301
私はそれを編集しました – Narase
これはあなたの問題ではないのですが、stringA、stringB、およびstringCのすべての文字列が範囲外になるとvoidptrを解放しようとするため、コードにコードの匂いがあります。 dlopenが呼び出される前にコンパイラがstringA/stringBのデストラクタへの呼び出しを挿入している可能性があります。したがって、cout voidptrの最後の呼び出しで解放され(2回)、解放されたメモリを出力します。 –