2010-12-22 9 views
0

私はこのコピーコンストラクタの問題を理解しようとしています。私が持っている質問は、プログラムが終了した後にデストラクタに関係します。変数char * titleは破壊されていないようですが、これは間違っていると思います。コピーコンストラクタの質問

オブジェクトxがx2に等しいときに代入演算子が呼び出されないのはなぜですか?私はコードブロックでg ++を使用しています。

#include <iostream> 

using namespace std; 

class myClass 
{ 
    private: 

     int x; 
     int *p; 
     char* title; 

    public: 

     myClass(int tx, int* temp, char* newtitle) 
     { 
      x = tx; 
      cout << "int constructor called with value x = " << x << endl; 

      p = new int; 
      p = temp; 

      title = new char [strlen(newtitle)+1]; 
      strcpy(title, newtitle); 
     } 
     myClass(const myClass& mc) 
     { 
      cout << "copy constructor called with value = " << mc.x << endl; 
      x = mc.x; 
      p = new int; 
      *p = *mc.p; 

      title = new char [strlen(mc.title)+1]; 
      strcpy(title, mc.title); 
     } 
     myClass & operator = (const myClass & that) 
     { 
      cout << "assignment called" << endl; 

      if(this != &that) 
      { 
       x = that.x; 
      } 
      return *this; 
     } 
     ~myClass() 
     { 
      if (p) 
      { 
       cout<<"deleting p"<<endl; 
       delete p; 
      } 
      else if(title) 
      { 
       cout<<"deleting title"<<endl; 
       delete[] title; 
      } 
     } 
}; 

int main() 
{ 
    int pointee = 10; 
    int* p = &pointee; 
    myClass x(3,p,"hello"); 
    //myClass y = myClass(3,p); 
    myClass x2 = x; 
    return 0; 
} 
+0

フォーマットが修正されました。 –

+3

デストラクタで "else if(title)"の代わりに "if(title)"が必要な場合があります – DReJ

+0

好奇心をそそる人:OPを含む人が多すぎるため、時間は、お互いの変更を上書きします。 – sbi

答えて

3

実際のコードと一般的なアプローチの両方で、私が見ることができたさまざまな問題があります。

まず、char * titleは削除しないため削除されません。おそらく論理エラーです:

if (p) 
    { 
     cout<<"deleting p"<<endl; 
     delete p; 
    } 
    else if(title) 
    { 
     cout<<"deleting title"<<endl; 
     delete[] title; 
    } 

おそらくelseは必要ありません。どうしてそこに置いたのですか?

次に、あなたはここで、intをリークしている:

p = new int; 
    p = temp; 

intあなただけのnew、渡された値tempによって上書きされます-ed。

その後、デストラクタでこのポインタを削除しようとします。しかし、自動変数へのポインタを削除するので、ヒープをホースします。これも論理的なエラーです。解決策:これをしないでください:p = temp;

最終的には、あなたのアプローチは複数のレベルで疑問です。

  1. intを最初に動的に割り当てるのはなぜですか?クラスのメンバーはintです。 が本当にする必要がある場合を除き、動的割り当て(例:newdelete)を使用しないでください。
  2. char*を使用して文字列を動的に割り当てないでください。代わりに、std::stringから#include <string>
  3. 本当にに動的割り当てが必要な場合は、生ポインタを使用しないでください。代わりにスマートポインタを使用してください。 C++には、#include <memory.h>からの1つのstd::auto_ptrが組み込まれていますが、他のライブラリでは多くのオプションが用意されています。ここでよく使われているのはブーストのスマートな指針です。
+0

次に、intが漏れています。 p = new int; p = temp; * p = * tempを使うべきですか?代わりに? – pandoragami

+0

@lost:いいえ、あなたは 'temp'を全く使ってはいけません。なぜあなたはそれが必要だと思いますか? –

+0

int * pにアドレスや値を割り当てる方法は?私はこれをいくつかのサイトからサンプルプログラムとして入手し、それを少し修正しました。 – pandoragami

1

あなたのデストラクタはpp場合は非NULLで削除されます。 NULLでない場合はtitleを削除しますpはNULLです。

しかし、コンストラクタとコピーコンストラクタは、常にnew pnew titleを作成します。したがって、常に両方をチェックして削除する必要があります。

0

ではなく

p = temp; 

*p = *temp; 

を試してみて、デストラクタで

if(title) 

代わりの

else if(title)