编辑代码

#include <iostream>
using namespace std;

class Demo {
public:
    Demo(): val(nullptr) {}
    ~Demo() {
        delete[] this->val;
    }
    void setVal(int* val) {
        this->val = val;
        for (int i = 0; i < 5; i++) {
            this->val[i] = i;
        }
    }
    friend ostream& operator<<(ostream& os, const Demo obj);

private:
    int* val;
};

// 错误,这里的const Demo obj 会被实际理解为const Demo obj = obj
// 因为使用这个方法的时候会传入一个obj对象,所以会理解为拷贝构造
ostream& operator<<(ostream& os, const Demo obj) {
    for (int i = 0; i < 5; i++) {
        os << obj.val[i] << " ";
    }
    return os;
    // 所以当这个函数执行完成后会自动调用析构函数
    // 由于是拷贝操作,当前类成员变量的地址和main方法中的obj成员变量相同
    // 释放完成后地址就不存在了,当main函数结束时,调用析构函数就会报错
}

int main(void) {
    Demo obj;
    
    int* val = new int[5];

    obj.setVal(val);

    cout << obj << endl;

    return 0;
}