C++的动态内存管理

1. 在堆区申请内存 new

  • 变量
    int *p = new int;
    int *p = new int(888); //分配并对分配的内存初始化
  • 数组
    int *p = new int[3];
    int *p = new int[3]{1, 2, 3}; //使用初值列表初始化,C++11支持

    2. 在堆区释放内存 delete

  • 变量
    delete p; //p为int * 类型,保存分配的内存的首地址

  • 数组
    delete [] p;
  • 注意!

    • 不要delete同一块内存2次,Linux会报double free 错误, Window不报错
    • 不要delete栈内地址,运行时Linux报错,Windows不报错
    • 可以delete NULL
    • 对野指针的处理 : delete p; p = NULL

      3. 优点

  • 更方便,更安全

    4. 示例

    ```cpp

    include

    include

    using namespace std;

int main(int argc, char const argv[]) { cout << “——————c风格内存管理” << endl; int p1 = (int )malloc(4); int p2 = (int *)malloc(12);

  1. *p1 = 666;
  2. for(int i = 0; i < 3; i++){
  3. *(p2 + i) = i + 1;
  4. }
  5. cout << *p1 << endl;
  6. for(int i = 0; i < 3; i++){
  7. cout << *(p2 + i) << endl;
  8. }
  9. *p1 = 777;
  10. for(int i = 0; i < 3; i++){
  11. *(p2 + i) = i + 1 + 10 * (i + 1);
  12. }
  13. cout << *p1 << endl;
  14. for(int i = 0; i < 3; i++){
  15. cout << *(p2 + i) << endl;
  16. }
  17. free(p1);
  18. free(p2);
  19. cout << "------------c++风格内存管理" << endl;
  20. int *p11 = new int(666);
  21. int *p12 = new int[3]{1, 2, 3};
  22. cout << *p11 << endl;
  23. for(int i = 0; i < 3; i++){
  24. cout << *(p12 + i) << endl;
  25. }
  26. *p11 = 777;
  27. for(int i = 0; i < 3; i++){
  28. *(p12 + i) = i + 1 + 10 * (i + 1);
  29. }
  30. cout << *p11 << endl;
  31. for(int i = 0; i < 3; i++){
  32. cout << *(p12 + i) << endl;
  33. }
  34. delete p11; // 不要重复释放同一块内存
  35. p11 = NULL;
  36. delete[] p12;
  37. p12 = NULL;
  38. int a = 88;
  39. int *p3 = &a;
  40. //delete p3; // 不要delete栈区内存
  41. int *p4 = NULL; // 可以delete NULL
  42. delete p4;
  43. return 0;

} ```