• 締切済み

関数で取得したポインタを削除したい

関数で取得したポインタを削除したい 以下のような方法で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; }

みんなの回答

回答No.3

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)
回答No.2

肝腎なところが隠されているので, どうにも判断の仕様がありません. pData0, pData1 については既に指摘されているところですが, 他にも CData::Remove() がどのような操作をしているのかが分かりません. それ以前に, 生のポインタはあんまり使うものじゃないな. std::shared_ptr なんかを勉強しよう.

  • anicicle
  • ベストアンサー率36% (129/356)
回答No.1

これだけの処理だと、 GetDataPointer()の存在の意味がないのですが…… (それよりもpData0の宣言は? pData0に格納されている実体は何処で確保してるの?) >これだとMain()で宣言したpdataが削除されるだけで、pData0のデータは残っています。 削除はされます。 「削除されない」と言っている確認方法はどのような方法をとっていますか? また、ソースが欠けているので断言はできませんが、全体としてソースの作りに問題ありませんか?

関連するQ&A

専門家に質問してみよう