int* M_heigt = new int(heigt);
->
M_heigt = new int(heigt);
【以下回答由 GPT 生成】
首先,当在进行深拷贝和浅拷贝时,涉及到对象中的指针成员变量。深拷贝是指创建一个新的对象,其中包含了指针指向的内存的副本。而浅拷贝是指创建一个新的对象,并将指针指向的内存地址也复制给新对象。
当进行深拷贝时,需要手动地为新对象的指针成员变量分配内存,并将原来指针指向的内存内容复制到新的内存中。而浅拷贝只是简单地将指针的值复制给新对象,这意味着新对象和原对象指向同一块内存。
下面是一个示例说明:
#include <iostream>
class Test {
public:
int* ptr;
// 默认构造函数
Test() {
ptr = new int(0);
}
// 拷贝构造函数
Test(const Test& other) {
ptr = new int(*other.ptr);
}
// 析构函数
~Test() {
delete ptr;
}
};
int main() {
Test obj1;
Test obj2 = obj1; // 深拷贝,通过拷贝构造函数创建新对象
std::cout << *obj2.ptr << std::endl; // 输出0
*obj1.ptr = 1; // 修改原对象的指针指向的内容
std::cout << *obj2.ptr << std::endl; // 输出0,说明深拷贝时创建了新的内存空间
return 0;
}
在上述示例中,通过拷贝构造函数创建了新对象obj2,它拥有一个在堆内存中的指针成员变量。通过解引用指针,我们可以获取指向的内存中的值。在进行深拷贝后,对原对象的指针指向的内存内容进行修改,不会影响新对象的指针指向的内存内容。这是因为在深拷贝时,为新对象的指针成员变量分配了新的内存空间。
然而,在进行浅拷贝时,新对象和原对象指向同一块内存空间。这意味着对原对象的指针指向的内存内容进行修改,也会影响到新对象的指针指向的内存内容。为了防止这种情况发生,我们需要在进行浅拷贝时,重载赋值运算符并手动处理指针成员变量。
总结一下,当进行深拷贝时,虽然解引用指针依旧可以获取到新对象指向的内存中的值;但是当进行浅拷贝时,解引用指针将会造成nullptr的出现,意味着指针指向的内存是无效的或者未分配的。
希望以上解释对您有所帮助,如果您还有任何疑问,请随时提问。
【相关推荐】