0

次の例では、ディープコピーを実行していますが、すべて正常に動作しますが、obj2 が範囲外になると、デストラクタが呼び出され、デストラクタ内でクラッシュするため、コードの何が問題なのかを助けてください:

#include "stdafx.h"
#include <windows.h>
#include <stdlib.h>
#include <iostream>
#include <conio.h>
using namespace std;

class ClassA
{
     private:
        char *str;
        int id;

     public :
        ClassA(int x, char *s)
        {
            int len = strlen(s)+1;
            str = new char[len];
            id = x;
            strcpy(str, s);
        }
       ~ClassA()
        {
            delete [] str;
        }
        ClassA(ClassA &obj)
        {
            id = obj.id;
            int len = strlen(obj.str);
            str = new char[len] + 1;
            strcpy(str, obj.str + 1);
        }
        void disply()
        {
            cout << id << " " << str << endl;
        }  
 };

 int main()
 {
   ClassA Obj1(5, "hello");
   {
    ClassA Obj2 = Obj1;
    Obj2.disply();
   }
   Obj1.disply();
    return 0;
 }
4

2 に答える 2

3

3 つのルールに従い、代入演算子を提供する必要があります。しかし、この行は疑わしいようです:

str = new char[len] + 1;
strcpy(str, obj.str + 1);

あなたはおそらく意味します

str = new char[len + 1];
strcpy(str, obj.str);

クラスの修正が完了したら、std::string代わりにchar*.

class ClassA
{
 private:
    std::string str;
    int id;
 public:
  // no copy constructor or assignment operator or destructor required
};
于 2013-03-28T07:01:34.113 に答える
0

代入演算子が必要です。このようにコピーコンストラクタを書く必要があります

ClassA(const ClassA &obj)

const は非常に重要です。

さらに、いくつかのバグがあります

        int len = strlen(obj.str);
        str = new char[len] + 1;
        strcpy(str, obj.str + 1);

する必要があります

        int len = strlen(obj.str);
        str = new char[len + 1];
        strcpy(str, obj.str);
于 2013-03-28T06:59:56.943 に答える