C++学习笔记之内存泄漏


前言

本文主要介绍C++内存泄漏,代码实现


一、内存泄漏是什么?

内存泄漏是一件每次可怕的事情,在平时的C++编程中,如果不注意内存的分配与回收,可能没有什么,但一旦在实际项目里面,发生这个,那么就会发生意想不到的事情啦。
我们在使用new操作符的时候,会给指针分配一块内存空间,但是如果不注意delete,长此以往那么就会发生内存泄漏啦

二、代码测试

1.发生内存泄漏的代码

代码如下(示例):

#include <iostream>
#include <vector>
using namespace std;

class A{
    char *s;
public:
    A(){

    }
    A(int len){
        s = new char[len];
        s[0]='s';
        s[1]='b';
    }
    char* getS(){
        return s;
    }
};
char *s;
void test(){
    A* a =new A(10000000);
    s = a->getS();
}

int main(){
    int i=1;
    while(1){
        test();
        cout<<s<<i++<<endl;
    }
    return 0;
}

可以看到,有一个A类,里面有一个指针,在其构造函数中,进行new操作为其分配空间。但是我没有写析构函数,进行对其的内存回收。顺便为了校验一下,一个局部函数里面的类的对象,会不会对已经分配好的内存空间自动进行回收。如果会收回,那么cout<<s<<i++<<endl;这句代码的效果是只有输出i的值的。
下面看看结果
在这里插入图片描述
显然,内存不会被自动回收。这也正是解释了为什么会有内存泄漏。因为持续分配空间出去,而不回收,空间总有用完的那一天。
在这里插入图片描述
在连续进行2492次分配1000,0000字节操作后,内存被我分配完啦,爆辣。

2.防止内存泄漏

在析构函数中使用delete语句(还有一种用法是delete[]这里不作具体介绍)
代码如下:

#include <iostream>
#include <vector>
using namespace std;

class A{
    char *s;
public:
    A(){

    }
    A(int len){
        s = new char[len];
        s[0]='s';
        s[1]='b';
    }
    char* getS(){
        return s;
    }
    ~A(){
        delete s;
    }
};
char *s;
void test(){
    A* a =new A(10000000);
    s = a->getS();
}
void test2(){
    A a(10000000);
    s = a.getS();
}

int main(){
    int i=1;
    while(1){
        test2();
        cout<<i++<<endl;
    }
    return 0;
}

在这里插入图片描述
可以看到,运行四万多次都不会内存泄漏。


总结

用来new 就必须要有delete

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值