C++的内存泄露与析构函数

首先,内存泄露是什么?我们按照百度词条的解释:
    内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。
   换而言之就是程序中动态分配的堆内存在程序结束时未释放导致内存浪费,或者在程序中使用完毕之后一直未释放导致程序运行速度变慢或是系统崩溃。
     C++中的内存内存泄漏大概是指在你申请了一块内存或者实例化了一个对象,所有指向这块内存的指针都指向了其他的地方,或者在使用完这块内存没有进行释放,特别是对于C++来说,由于它缺少垃圾回收机制,及时进行内存释放,避免内存泄露是非常重要的。

1. 常见的内存泄露的情况及应对策略
(1)指针指向的内存
class A {
public:
	int a;
	A(int name) {
		a = name;
	}
};
int main(){
	A *c = new A(1);
	return 0;
}

此时若使用系统默认的析构函数会造成内存的泄露,此时我们需加上 delete c;

(2).指针间的赋值(如下例子)

class A {
public:int a;
A(int name) {
a = name;
}
};
int main(){
A *b = new A(1);
A *c = new A(2);
b = c;
delete c;      
delete b;
return 0;
}

在上面的例子中b指针实现指的内存就存在内存泄露的情况。
形如上述情况,就是指针之间的赋值。指针之间的赋值很容易导致内容泄露,所以在我们进行指针赋值的时候一定要注意到是否有块内存会发生内存泄露,或者对被赋值的指针先进行析构,释放内存,再进行赋值。
(3).类中的成员变量是类指针等需要动态内存的变量


class A {
public:
int a;
A *b;
A(int name) {
a = name;
}
};
int main(){
A *c = new A(1);
A d(1);
c->b = new A(2);
d.b = new A(2);
delete c;
return 0;
}

在程序退出之后,指针c指向的内存和对象d的内存会被释放,但是其内部的指针b所指的内存块会被留下来,成为一个无指针堆内存,造成动态泄露。

(4).对象数组或对象容器
顾名思义即我们创建了一个存放动态对象的数组或者容器,在我们对内存进行释放的时候,若只对数组内存释放,而未释放所存储的对象的内存,将会造成内存泄露。
(3)和(4)的情况要求我们对析构函数进行改造:
class A {
public:
	int a;
	A *b;
	A(int name) {
		a = name;
	}
	~A() {
		delete b;
	}
};
int main() {
	A *c = new A(1);
	A d(1);
	c->b = new A(2);
	d.b = new A(2);
	delete c;
	return 0;
}

(5).各分支语句

最后一种是在我们写分支语句时要考虑所有分支发生的情况及内存释放的过程,不要在某些分支中遗漏了某些对象的释放。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值