C++析构和深拷贝的问题

#include <iostream>
#include <cstring>

using namespace std;

class MyString{
private:
    char *p_string;
    int str_length;
public:
    MyString(char *origin);
    ~MyString(){
        if(p_string != NULL){
            delete []p_string;
            cout<< "析构函数被调用"<< endl;
        }
    }
    char* getP_string(){
        return p_string;
    }
    void print_Add(){
        cout<< &p_string<< endl;
    }
    void set_p(char* origin){
        int l = strlen(origin);
        if(l <= strlen(p_string)){
            p_string = origin;
        }else{
            str_length = l;
            delete []p_string;
            p_string = new char[l + 1];
            strcpy(p_string, origin);
        }
    }
};
MyString::MyString(char *origin){
    str_length = strlen(origin);
    p_string = new char[str_length + 1];
    strcpy(p_string, origin);
    p_string[str_length] = '\0';
    cout<< "构造函数被调用"<< endl;
    //cout<< &p_string<< endl;
}

int main(){
    MyString iteral("iteral");
    MyString copy(iteral);
    copy.set_p("Hello");
    cout<< iteral.getP_string()<< endl;
    cout<< copy.getP_string()<< endl;
    return 0;
}

上面这段代码,为什么在执行时,加入了析构函就报错?还有就是为什么我没写深拷贝构造函数,为什么两个对象中的指针分别指向的是不同的内存?

你又重新申请内存了,这就使用了深拷贝构造函数了。
而且,你的构造函数里面不需要加上'\0'了吧。
以前写类的时候也犯过写入析构函数就报错的情况,具体忘了,你再看看吧


1. 你在拷贝构造函数里面调用了strcpy(),这就是正儿八经的深拷贝啊。浅拷贝是指只拷贝指针值

2. 至于析构函数,是因为你的set_P()写的有问题,你这个函数的本意应该是更改字符串的值是吧?那么无论如何你都应该重新分配空间,然后进行字符串赋值。这个 l< strlen(p_string)并没有意义,因为你在if条件后是一个浅拷贝的操作,只是进行了指针赋值。也正是因为这个浅拷贝,在copy这个对象调用析构函数的
时候,析构函数试图释放一个静态字符串常量,而这是不允许的,你只能释放堆中分配的空间(malloc或者new的内存空间)
最后,只是一个小的建议,你的类里面的两个成员变量都是有意义的,尤其是还包含了一个指针,构造的时候应该显式初始化