复制构造函数在 C++ 中抛出 null 值错误

Copy constructor throws null value error in C++

提问人:kesarling He-Him 提问时间:11/30/2022 更新时间:11/30/2022 访问量:147

问:

(与cpp失去联系太久了,想为明天的面试复习一下)。
正在修改 Deep Copy 与 Shallow Copy。 编写代码:


#include <iostream>

class MyClass {
public:
    unsigned int* uivar = nullptr;

    MyClass() : uivar(new unsigned int) {
        *(this->uivar) = 3;
    }

    ~MyClass() { delete uivar; }

    MyClass(const MyClass& mCopy) {
        *(uivar) = *(mCopy.uivar);
    }
};

void function(MyClass m) {
    *(m.uivar) = 4;
}

int main() {
    MyClass myClass;
    MyClass myClassCopy = myClass;
    std::cout << *(myClass.uivar) << "\n";
    std::cout << *(myClassCopy.uivar) << "\n";
    function(myClass);
    std::cout << *(myClass.uivar) << "\n";
    std::cout << "hhhh" << "\n";
    *(myClassCopy.uivar) = 5;
    std::cout << *(myClass.uivar) << "\n";
    return 0;
}

错误 (-警告): 在 .
我错过了什么?
Dereferencing NULL pointer uivar*(uivar) = *(mCopy.uivar);

C++ 复制构造函数 deep-copy shallow-copy

评论

8赞 Quimby 11/30/2022
Copy ctor 不执行默认的 ctor。
1赞 PaulMcKenzie 12/1/2022
想为明天的面试复习一下 -- 您的代码缺少用户定义的赋值运算符。
0赞 kesarling He-Him 12/1/2022
@PaulMcKenzie,是的,我知道......我受够了。

答:

5赞 Cory Kramer 11/30/2022 #1

您的复制构造函数不正确,它需要分配自己的指针

MyClass(const MyClass& mCopy) {
    uivar = new unsigned int(*mCopy.uivar);
}

评论

0赞 kesarling He-Him 12/1/2022
哎呀脑子放屁......谢谢伙计!
0赞 kesarling He-Him 12/1/2022
这本身可能是一个单独的问题,但是浅层复制可以用普通而不是指针来实现吗?“正常”变量的默认值恰好是深拷贝,而指针的默认值是浅拷贝......unsigned int
1赞 Avi Berger 12/1/2022
@kesarlingHe-Him 与指针不同,没有“深”,它就在那里。因此,在非指针无符号 int 情况下,浅拷贝和深拷贝之间没有区别。unsigned int