为什么销毁后不提示“双重释放”

时间:2019-02-25 15:06:53

标签: c++ oop

我尝试在复制构造之后(在def export(): with open("listtxt.txt", 'w') as export_file: json.dump(mainlist, export_file) 附近)测试“ 双重免费 ”,但是 ./ a.out 不要提示。

AutoPtr<A> p_b = p_a

终端输出:

#include <iostream>

using namespace std;

class A {
public:
    A(int i = 0) { cout << "A construct:" << this << endl; }
    ~A() { cout << "A destruct:" << this << endl; }
    void print() { cout << n << endl; }
    int n;

};

template<typename T>
class AutoPtr {
public:
    AutoPtr(T *p= NULL): ptr(p) {}

    ~AutoPtr() {
        cout << "AutoPtr destruct: " << ptr << endl;
        delete ptr;
    }

    T &operator*(void) const {
        return *ptr;
    }

    T *operator->(void) const {
        return &**this;
    }

private:
    T *ptr;

};

int main(void)
{
    AutoPtr<A> p_a(new A(0));
    ++p_a->n;
    p_a->print();
    AutoPtr<A> p_b = p_a;
    ++p_b->n;
    p_b->print();

    return 0;
}

我的gcc版本8.2.1

1 个答案:

答案 0 :(得分:1)

使用new分配的通过不指向有效对象的指针进行删除的行为(例如,当指针被另一个删除使之无效时)是不确定的。

不能保证行为未定义的程序会“提示”任何事情。