野指针带来的堆错误(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操作;

猜你喜欢

转载自blog.csdn.net/cxy_hust/article/details/115268401
今日推荐