This question already has answers here:
What is The Rule of Three?

(8个答案)


9个月前关闭。



  #include <iostream>

    using namespace std;

    class Shallow {
    private:
        int *data;
    public:
        void set_data_value(int d) { *data = d; }
        int get_data_value() { return *data; }
        // Constructor
        Shallow(int d);
        // Copy Constructor
        Shallow(const Shallow &source);
        // Destructor
        ~Shallow();
    };

    Shallow::Shallow(int d) {
        data = new int;
        *data = d;
    }

    Shallow::Shallow(const Shallow &source)
        : data(source.data) {
            cout << "Copy constructor  - shallow copy" << endl;
    }

    Shallow::~Shallow() {
        delete data;
        cout << "Destructor freeing data" << endl;
    }

    void display_shallow(Shallow s) {
        cout << s.get_data_value() << endl;
    }

    int main() {

        Shallow obj1 {100};
        display_shallow(obj1);

好吧,直到这里
浅obj2 {obj1};
在这里我的程序停止运行
obj2.set_data_value(1000); enter code here在这一点上谁能向我解释一下
返回0;
}
在我的程序结束时出了点问题

最佳答案

问题在于,每次对Shallow::~Shallow的调用都会删除data指针的内存,但并非每个新的Shallow都会分配一个新的内存块。每个delete需要精确地对应一个new。但

display_shallow(obj1);

1)创建一个新的临时Shallow对象(按值传递给display_shallow),该对象使用dataobj1指针

2)销毁临时文件,这将删除临时文件和obj1都使用的内存块
obj2也共享obj1的指针,该指针不再指向任何地方。当您尝试调用obj2.set_data_value(1000)时,您将取消引用无效的指针,这是未定义的行为。您应该认为自己很幸运,该程序只是崩溃了,而不是发射了核导弹。

关于c++ - 为什么程序会崩溃,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60747525/

10-12 17:33