1.1 new关键字及内存泄漏

new关键字是C++用来动态分配内存的主要方式。

代码演示:

new可以直接分配单个变量的内存,也可以分配数组。

在分配单个对象的内存时:

当对象是普通变量时,可以分配对应的内存

#include<iostream>

int main(){
    
    
    int* pi = new int(100);
    std::cout << *pi << std::endl;
    return 0;
}

当对象是类对象时,会调用构造函数,如果没有对应的构造函数,就会报错。

#include<iostream>

int main(){
    
    
    std::string* pString = new std::string("hello world");
    std::cout << *pString << std::endl;
    return 0;
}

注意:New出来的对象,必须delete释放。

在分配数组对象内存时:

对于普通变量:可以使用"()"将所有对象全部初始化为0。

#include<iostream>

int main(){
    
    
    int* pi = new int(100)();
    std::cout << pi[20] << std::endl;
    
    delete[] pi;
    return 0;
}

注意:若没有(),pi分配的内存就成为未定义的了,没有人知道值是多少,当然从汇编角度是可以知道的。

对于类对象,有没有"()"都一样,均使用默认构造函数,如果没有默认构造函数就会报错。

#include<iostream>

class Test{
    
    
public:
    Test(int i_):i(i_){
    
    }
private:
    int i;
};

int main(){
    
    
    Test* pTest = new Test[100];
    return 0;
}

2.内存泄露介绍:内存泄露是经常出现的常见bug。

内存泄露会导致堆内存的逐渐被占用,最终内存用完程序崩溃。常见的情况就是项目测试没问题,上线几天就炸了。然后就会非常麻烦,排查困难,损失很大。

内存泄露是最严重的错误之一,程序不怕报错,就怕一开始运行的好好的,突然就出现了莫名其妙的错误。

这句话也引出了后面的两个部分:
智能指针可以非常好的避免内存泄露的问题。
异常处理部分可以恰当的处理程序出现的异常,让程序有错误就立马处理,或直接终止进程,或忽略,不要让异常莫名其妙。这是程序设计的重要理念。

猜你喜欢

转载自blog.csdn.net/shouchen1/article/details/127591814
1.1