深拷贝和浅拷贝我开辟了一个堆去为啥不能解引用

img


为啥后面解引用会出现nullprt那个东西又是什么意思,是编译器的原因吗

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的出现,意味着指针指向的内存是无效的或者未分配的。

希望以上解释对您有所帮助,如果您还有任何疑问,请随时提问。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^