2016-12-16 7 views
0

の原因となります。同様に、このよう:のshared_ptr <EVP_PKEY>が、これは私が持っているもので、基本的にヒープ破損

shared_ptr<EVP_PKEY> evpKeyPtr{EVP_PKEY_new(), EVP_PKEY_free}; 
//same code as above to get key from file 
EVP_PKEY_free(evpKeyPtr.get()); 
//evpKeyPtr does not go out of scope before the corruption occurs 

しかし、これにはない:

EVP_PKEY* evpKey = EVP_PKEY_new(); 
//same code as above to get key from file 
EVP_PKEY_free(evpKey); 

私は、これが発生する可能性が理由として損失でいます。私は第二のコードが忠告されていないことを知っていますが、何が起こるかをテストするためにそれを行いました。

+0

問題を再現するコンパイル可能な実行可能なテストケースを投稿する必要があります。 – xaxxon

+0

'std :: shared_ptr evpKeyPtr(EVP_PKEY_new()、[](EVP_PKEY * p){EVP_PKEY_free(p);});'? –

+0

C++ 11と 'unique_ptr'を試してみてください。私は頻繁にそれを使用し、それが動作することを知っている。私はC++ 03と 'shared_ptr'パターンを試みたことはありません。これがうまくいくには、 'release'(' get'ではなく): 'EVP_PKEY_free(evpKeyPtr.release()) 'を呼び出す必要があると思います。 'release'を呼び出すと、もう' evpKeyPtr'を使うことはできません。 – jww

答えて

1

あなたはポインタを取得しますが、shared_ptrはその所有者であり続けます。スコープの最後に2回削除されます。

所有権を取得したい場合は、unique_ptr(release()メソッドがあります)を使用します。

+0

中間コードのshared_ptrは私の質問に関するものではありません。しかし、shared_ptrがヒープの破損が発生する前にshared_ptrが有効範囲外になりませんでした。つまりshared_ptrがまだポインタを所有していて、get()でEVP_PKEY_freeを呼び出すとヒープの破損が発生しました。 –

+0

shared_ptrは、デスティネータ内の管理リソースを常に解放します!= nullptr。所有権を取得せずに範囲内で手動で削除しようとしています。 –

+0

試しただけでなく、 'EVP_PKEY_free(evpKeyPtr.get())';で削除してください。 –

0

私はちょうど私が間違っていたことを理解しました。それはstd::shared_ptrとはほとんど関係ありません。 std::shared_ptrの基になるポインタを誤った形で指している一時的なものを使用しようとしていました。

関連する問題