野指针带来的堆错误(nt.dll)[堆已损坏]

记野指针带来的堆错误

错误流程:

结构体里面有指针,
结构体的vector整个赋值给了别人,
然后自己的直接clear了,
然后vector的clear()会释放指针的内存,但是却不会将指针置空
再去访问时就出错

简单错误再现

#include <iostream>

class A {
public:
    A() {
        ptr = new char[3];
    }

    inline void Release() {
        if (ptr != nullptr) {
            // std::cout << "ptr is: " << ptr << std::endl;
            delete ptr;
            ptr = nullptr;
        }
        std::cout << "call des" << std::endl;
    }

    ~A() {
        Release();
    }
    char* ptr;

};


int main() {
    A tmp = A(); 
    A tmp2 = tmp; // 这里将数据传递给tmp2,tmp我们不需要了,但是不能执行tmp的释放,因为tmp里面的数据我们任然需要
    // tmp.ptr = nullptr; // 取消这句的注释,可以解决该bug

    tmp2.ptr[0] = '1';
    tmp2.ptr[1] = '1';
    tmp2.ptr[2] = '1';
    tmp.Release();
    return 0;
    // in fact, when ready to exit the main, will automatically call the tmp2's destructor
}


Tips:

  • 1 如果你决定把一个对象以及它所指向的内存的所有权(读写,销毁的权利)交给另一个对象,赋值完以后务必立马将原来的对象置空,应当把这一过程看成是对原来的对象的delete操作;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值