动态内存分配

通过实际需要的空间来开辟内存是一种高效的方法。

new运算符实现动态内存分配

用法一:分配一个值

P = new T

T是任意类型名,P是类型为T*的指针,该语句分配出大小为sizeof(T)字节的空间并把内存的起始地址传给P。

int* pn;
pn = new int;
*pn = 5;

用法二:分配一个数组

P = new T[N];

T为任意类型名,P为类型T*的指针,N是要分配的元素个数(可以是整形表达式)。该语句开辟了N*sizeof(T)的内存空间,并把初始地址传给P。

只要是通过动态内存分配的,无论在哪里,[]内可以填写整形表达式
int getSize(){
    return 5;
}
int* a = new int[getSize()];    //正常
int main(){
    static int* b = new int[getSize()]; //正常
    int* n = new int[getSize()]; //正常
    return 0;
}

但请注意!new关键字开辟的内存未初始化值

跟普通的声明做对比,普通的变量在函数内声明可以填写表达式,但如果声明方法要穿透全局,就会失效。

int getSize(){
    return 5;
}

int a[getSize()]; //错误

int main(){
    static int b[getSize()]; //错误
    int n[getSize()]; //正常
}

返回值

new关键字后返回的一律为T*,不管是数组还是一个数,比如

int* p = new int;
int* q = new int[10];

delete运算符释放空间

delete只可以用于释放new开辟的空间,且一个指针只能释放一次

delete T*;    //删除一个数
delete []p;    //删除一个数组

请注意!如果delete数组没有加括号,就意味着只删除了数组的第一个元素,其它的还在,数组并没有被释放掉。

奇怪的例子

Example

int main(){
    int* a[] = {
        NULL,NULL,new int,new int[6]
    };
    
    *a[2] = 123;
    a[3][5] = 456;

    

    if(! a[0] ) {
        cout << * a[2] << "," << a[3][5];
    }

    return 0;
}
Last modification:March 5th, 2020 at 08:11 pm
Compared with money, your comment could inspire me more.
相较于钱财,你的留言更能激发我创作的灵感