销毁后为什么不提示"double free"

Why not prompt "double free" after destructing

本文关键字:double free 提示 为什么不      更新时间:2023-10-16

我尝试测试" double free "复制构造后(AutoPtr<A> p_b = p_a附近),但 ./a.out不提示它。

#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;
}

终端输出:

$ ./a.out
A construct:0x781b68
1
2
AutoPtr destruct: 0x781b68
A destruct:0x781b68
AutoPtr destruct: 0x781b68
A destruct:0x781b68

我的GCC版本8.2.1

通过指向有效对象的指针删除的行为(例如,使用new分配的另一个删除无效的指针是无效的)。

无法保证其行为不确定的程序会"提示"任何内容。