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。
内存泄露会导致堆内存的逐渐被占用,最终内存用完程序崩溃。常见的情况就是项目测试没问题,上线几天就炸了。然后就会非常麻烦,排查困难,损失很大。
内存泄露是最严重的错误之一,程序不怕报错,就怕一开始运行的好好的,突然就出现了莫名其妙的错误。
这句话也引出了后面的两个部分:
智能指针可以非常好的避免内存泄露的问题。
异常处理部分可以恰当的处理程序出现的异常,让程序有错误就立马处理,或直接终止进程,或忽略,不要让异常莫名其妙。这是程序设计的重要理念。