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平台的VLDLinux平台的Valgrind

参考资料

  • 飘零的落花 - 现代C++详解
  • C++20高级编程