C++内存操作符:new分配 与 delete释放

一. new操作符

1. 功能与语法

在C++中,new操作符用于动态分配内存。它的基本语法有两种形式:一种是分配单个对象的内存,例如int *p = new int;,这里new操作符在堆上分配了足够存储一个int类型对象的内存空间,并返回指向该内存空间的指针p;另一种是分配数组的内存,如int *arr = new int[5];,这会在堆上分配能够存储5个int类型元素的连续内存空间,arr指向这个数组的首元素。

2. 初始化

对于基本类型,可以在分配内存的同时进行初始化。例如int *p = new int(10);,这里不仅分配了一个int类型的内存空间,还将这个空间初始化为10。对于自定义类型(类类型),如果类有合适的构造函数,new操作符会调用构造函数来初始化对象。例如:

class MyClass {
    public:
        MyClass(int num) : value(num) {}
        int value;
};
MyClass *obj = new MyClass(20);

二. delete操作符

1. 功能与语法

delete操作符用于释放由new操作符动态分配的内存。对于单个对象的内存释放,语法为delete p;,其中p是由new分配的单个对象的指针。例如,对于前面分配的int类型指针p(int *p = new int;),使用delete p;来释放内存。对于数组的内存释放,语法为delete[] arr;,其中arr是由new分配数组内存的指针。例如,对于int *arr = new int[5];,使用delete[] arr;来释放数组内存。

2. 注意事项

如果使用delete时不匹配(用delete释放数组内存或者用delete[]释放单个对象内存),会导致未定义行为。例如,如果对int *arr = new int[5];使用delete arr;(而不是delete[] arr;),可能会导致内存泄漏或者程序崩溃等问题。

不能对同一个指针多次调用delete操作符,这也会导致未定义行为。例如:

int *p = new int;
delete p;
// 以下操作是错误的
delete p;

三. 内存管理的重要性与潜在问题

1. 内存泄漏

如果动态分配的内存没有被正确释放(例如,忘记调用delete或delete[]),就会导致内存泄漏。内存泄漏会使程序占用的内存不断增加,最终可能导致系统内存耗尽。例如:

void leakMemory() {
    int *p = new int;
    // 没有释放p所指向的内存,函数结束后,这块内存无法被再次使用
}

2. 悬空指针

在释放内存后,如果没有将指针设置为nullptr(C++11及以上)或者其他合适的值,指针就会变成悬空指针。悬空指针指向的是已经被释放的内存区域,对悬空指针进行解引用操作会导致未定义行为。例如:

int *p = new int;
delete p;
// p现在是悬空指针
// 以下操作是危险的
*p = 10;

C++编程语言基础

C++内存操作符:new分配 与 delete释放