#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的内存空间)
最后,只是一个小的建议,你的类里面的两个成员变量都是有意义的,尤其是还包含了一个指针,构造的时候应该显式初始化