0

在以下示例中,我正在做 deepcopy,一切正常,但是当 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

您需要遵循三规则并提供赋值运算符。但是这条线看起来很可疑:

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)

常量非常重要。

另外你有几个错误

        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 回答