C++内存泄漏--**关于“异常0xc0000005 读取的位置 0xDDDDDDDD时发生冲突”

C++中,很多方式可以引起内存泄漏,譬如如下代码:

class RefClass
{
public:
    RefClass(int n_)
    {
        pInt = new int(n_);
        
    }
    
    ~RefClass()
    {
        if(NULL != pInt)
        {
            delete pInt;
            pInt = NULL;
        }
    }
    
    int* pInt = NULL;
};

/*
	检查*p_n_是否为0,是的话,通过删除p_n_,间接删除ref_class_->pInt
*/
void checkPtr(RefClass* ref_class_, int*& p_n_)
{
	if(*p_n_ == 0)
    {
        delete p_n_;  //删除指向的内存
        p_n_ = NULL;  //置NULL
    }
    
    return;
}

void main()
{
    RefClass* _pRefClass = new RefClass(0);
	int* _p_n = _pRefClass->pInt;
    checkPtr(_pRefClass, _p_n);
    
    delete _pRefClass; //析构类对象,会造成内存泄漏
}

运行上述程序,会发生内存泄漏。删除内存的操作很规范

delete p_n_;  //删除指向的内存
 p_n_ = NULL;  //置NULL

为什么还会泄漏呢? 根本原因是,调用checkPtr(RefClass* ref_class_, int*& p_n_)函数时,传入的是指向ref_class_->pInt内存的另一个指针_p_n,

delete p_n_;  // 删除指向的内存,即ref_class_->pInt指向的内存被删除
p_n_ = NULL;  // p_n_置NULL,但是!!!ref_class_->pInt没有被置NULL,因为指针p_n_并不是ref_class_->pInt的引用。p_n_只是main中_p_n的引用
			  // 此时ref_class_->pInt成为野指针,因为它指向的内存已经被delete了

正确的用法是,将_p_n声明为 _pRefClass->pInt的引用,即int*& _p_n = _pRefClass->pInt;

所以在进行内存删除和指针重置时,要确定是否对原始内存和原始指针真正生效!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值