02 - new关键字及内存泄漏
new 关键字
内存是计算机的底层组件,扎实理解C++动态内存的工作原理对成为一名专业的C++程序员至关重要。
简单使用
new
关键字是C++用来动态分配内存的主要方式。new
可以直接分配单个变量的内存,也可以分配数组:
分配单个对象的内存:
- 普通变量,可以分配对应的内存。
int* ptr {new int(2)}; delete ptr;
- 类,会调用构造函数,如果没有对应的构造函数,会报错。
std::string* pStr {new std::string("test")}; delete pStr;
- 普通变量,可以分配对应的内存。
分配数组对象的内存:
- 普通变量,使用
()
将所有对象全部初始化为0.
int* pi {new int[100]()}; delete[] pi;
- 类,有没有
()
都一样,均使用默认构造函数,没有就会爆错。std::string* pStr {new std::string[100]}; delete[] pStr;
- 普通变量,使用
PS:使用new
给对象分配空间后,一定要记得使用delete
关键字来释放这个空间,否则会造成内存泄漏。并且,这样做也比较麻烦,而使用智能指针和标准库容器是更好的解决方法。
当内存分配失败
new
分配内存也存在失败的情况,此时会抛出一个异常。也有不抛出异常的版本:new(nothrow)
,如果分配内存失败,它会返回nullptr
。
内存泄漏
分配内存,但没有释放,就会发生内存泄漏。内存泄漏是经常出现的bug,会导致自由存储区的内存逐渐被占用,最终让程序崩溃。
市面上现在有很多内存泄漏检测工具,如 Windows平台的VLD 和 Linux平台的Valgrind 。
参考资料
- 飘零的落花 - 现代C++详解
- C++20高级编程