c++ - 为什么程序很糟糕

标签 c++ c++11 c++14

这个问题在这里已经有了答案:





What is The Rule of Three?

(8 个回答)


2年前关闭。



  #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 的对象(按值传递给 data) obj1的指针

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

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

相关文章:

c++ - 声明引用在类中有效,但在主函数中无效

c++ - 虚拟析构函数的默认覆盖

c++ - 如何为 ATmega8 微 Controller 实现自己的刷机软件

c++ - 我的方法是否符合线程池方法的条件?

c++ - 梯度和内存

c++ - 如何在C++11中的用户定义类模板中继承std::vector模板?

C++ 正则表达式行为

c++ - 使用 boost::locale/ICU 边界分析与中文

c++ - constexpr 对匿名结构变量的引用

c++ - 函数模板参数的模板返回类型