2011-08-08 9 views
3

Poco C++ライブラリを使用していて、奇妙な問題が発生しています。 独自の共有ポインタクラスを使用するPoco SharedPtr内部ポインタ操作用。私の場合、静的オブジェクトPoco::SSLManagerには、SharedPtrの証明書Handlersオブジェクトのメンバーがあります。プログラムの実行が終了すると、静的オブジェクトが削除され、セグメント化エラーが発生します。 GDBデバッガを使用していますが、コアダンプが表示されていますが、問題は理解できません。 SharedPtrオブジェクト(簡易操作:delete pObj)を削除するとSegフォルトが発生しますが、オブジェクトには有効なアドレスがあります(例:0x8fcbed8)。有効なアドレスを持つC++削除ポインタ

なぜ有効なアドレスを持つポインタを削除すると、セグメンテーションフォルトが発生する可能性がありますか?
オブジェクトがアプリケーションのフォークコピーに作成され、メインで破棄される可能性がありますか?

+0

オブジェクトポインタを削除する前に、nullポインタと削除後の操作がnullに設定されていることを確認しました。 – Reddy

+1

SharedPtrには通常 'ptr-> Release()'関数があります。それをチェックしてください。 – Gasim

+5

@Reddy: 'null'ポインタで何もしないことが定義されているので、' delete'を呼び出す前に 'null'をチェックしないでください。 – Puppy

答えて

11

有効なアドレスはアクセス可能なアドレスです。それが削除に適しているということではありません。 deletenewから戻ったものを返すことができます。 newしていない場合は、deleteできません。静的オブジェクトまたは自動オブジェクトの削除は、定義されていません。また、new以外のソースから取得することもできます。

+5

さらに、一度だけ削除することもできます... –

+3

さらに、スマートポインタから出てくるものは決して削除しないでください。スマートポインタは、削除自体を処理するため、「スマート」と呼ばれます。 –

+0

もちろん、新しくしました。しかし、フォークプロセスでは新しいことがあり、オブジェクトのストアは静的オブジェクト(共有ライブラリから作成するため - 親プロセスで破壊する)になります。私はそれが紛争かもしれないようです。 – Reddy

0

shared pointerを使用することについて話します。その削除がpObjの最後の削除である場合、オブジェクトが削除された最後の時刻である可能性があります。共有ポインタが指すオブジェクトが最終的に破棄されます。その場合、pObjのdestructorが呼び出され、そこからSegフォルトが取得される可能性があります。

一方、Poco libが使用する共有ポインタの実装によっては、共有ポインタの削除を呼び出して共有ポインタを誤って使用している可能性があります。

+0

Poco SharedPtrはスマートなptrのように見え、内部原子カウンタを使用します。私はまた、私の問題オブジェクト(InvalidCertificateHandler)のデストラクタをチェックしました。これは単純なオブジェクトであり、親ではなく、ブール変数が1つしかありません。デストラクタで私はいくつかの静的オブジェクトSSLManagerメソッドの呼び出しを見ていますが、コメントの後ではアプリケーションの動作は変更されません。 – Reddy

+0

あなたは共有されたptrを間違って使っていると思いますが、推測するのは難しいです。あなたの投稿を編集し、[Shared Ptr](http://www.appinf.com/docs/poco/Poco.RC.html#13607) –

0

他の言われているように、あなたのポインタが0x8fcbed8のように「良い」と思われるので、正しいポインタではありません。

実際、「削除」を使用すると、ポインタはその値を保持します。しかし、もう使用しないでください。 (削除した直後にNULLに設定して、デバッガで "空"と表示することをお勧めします)。

Linuxで開発している場合に間違ったものを見つけるのに役立つツールがあります。それは、valgrindのです:それは広く使われているツールであるため、

valgrind your_program [args] 

(ただ、すでにここであなたが通常起動するコマンドの前に「valgrindのを」追加インストールvalgrindのない場合は、お使いのディストリビューションにそれのためのパケットを持っている必要があります。)

これでvalgrindは実行中のプログラム(少し遅くなります)を検査し、あなたが削除すべきでないものを削除するとすぐにあなたに報告します。 (その他の多くのエラー)

0

これは非常に難しい問題ですが、問題は完全にわかりませんが、私はそれと私の解決策を説明しようとします。 問題はプラットフォーム固有で、Gentoo Linux(gcc 4.5.5コンパイラ、Pocoライブラリあり)でのみ発生します。

私は、さまざまなリクエストを処理するためにモジュール(プラグイン)を使用するデーモンを持っています。モジュールとデーモンは、pocoライブラリを使用する1つの静的ライブラリを使用します。静的ライブラリにSSL接続を作成するコードがあり、結果としてSSLマネージャが作成されます。静的ライブラリは、モジュールとデーモンにリンクされています。

私は私の質問に書かれているセグメンテーションフォールトを持っています。私は静的ライブラリを共有ライブラリに変更し、問題はなくなり、segフォルトはありません。すべて正常に動作します。

本当に私はそれを強調していませんが、gentooでgccコンパイラのバグのようです。他のLinux上では、他のgccはすべて静的ライブラリでうまく動作します。

+0

を作成し操作する行のようなコードをいくつか追加してくださいgcc 4.5.5のGentoo Linux - 間違い4.4.5バージョン – Reddy

関連する問題