- 締切済み
関数で取得したポインタを削除したい
関数で取得したポインタを削除したい 以下のような方法でMain関数からpData0の実体を削除しようとしています。 ですが、これだとMain()で宣言したpdataが削除されるだけで、pData0のデータは残っています。 調べたところ、pdata = GetDataPointer(0)は、単なるポインタコピーに過ぎないからでしょうか。 このような場合は、どうしたらよいのでしょうか? よろしくお願いします。 void Main(void) { CData *pdata; pdata = GetDataPointer(0); if (pdata) { pdata->Remove(); pdata = NULL; } } CData* GetDataPointer(int fg) { CData *pRetData; switch (fg) { case 0: pRetData = pData0; break; case 1: pRetData = pData1; break; } return pRetData; }
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- CanvasShoes
- ベストアンサー率64% (16/25)
class CData { public : CData(void) ; virtual ~CData() ; void Remove(void) ; } ; というクラスがあり、 可能性として、Remove()が以下の2つのように定義されていると仮定します。 (1) void CData::Remove(void) { delete some_member_data ; delete this ; } ; (2) void CData:Remove(void) { delete some_member_data ; } ; (1)と(2)の違いは、おわかりですね? 次のコードは、 (1)の場合、NGです。(CDataという器を2度deleteしてしまうから。) (2)の場合、OKです。 void main() { CData *pNewObject = new CData() ; pNewObject->Remove() ; delete pNewObject ; } ・CDataという容器の中身を削除する。(delete some_member_data) ・CDataという容器自体を削除する。(delete this) を区別してお考えになるとよいと思います。
- Tacosan
- ベストアンサー率23% (3656/15482)
肝腎なところが隠されているので, どうにも判断の仕様がありません. pData0, pData1 については既に指摘されているところですが, 他にも CData::Remove() がどのような操作をしているのかが分かりません. それ以前に, 生のポインタはあんまり使うものじゃないな. std::shared_ptr なんかを勉強しよう.
- anicicle
- ベストアンサー率36% (129/356)
これだけの処理だと、 GetDataPointer()の存在の意味がないのですが…… (それよりもpData0の宣言は? pData0に格納されている実体は何処で確保してるの?) >これだとMain()で宣言したpdataが削除されるだけで、pData0のデータは残っています。 削除はされます。 「削除されない」と言っている確認方法はどのような方法をとっていますか? また、ソースが欠けているので断言はできませんが、全体としてソースの作りに問題ありませんか?