动态内存分配

前言

因为直接学了C++,所以对C的一些细节了解不是很清楚,于是在这里补充一点小知识——动态内存分配,C++中相关的是newdelete,而C中相关的是malloccallocreallocfree

注:alloc代表allocate,意为“分配”

 

delete p和delete[]p的区别

这是腾讯面试时被问了2次的问题,当时我回答了,delete p一般用来删除给单个元素分配的内存,而delete []p是用来删除数组的内存分配

而面试官继续问,“这两个可以互换使用吗?”

然后我就不会了,第一次被问后忘记去查,所以第二次自然也杯具了。

在多数编译器中两种表达式等价,使用没有区别,操作符重载不同而已。不过,那是编译器人家自己优化得好,所以真正的区别是……

  1. 对于基本数据类型(单个或数组),delete p和delete []p无区别。
  2. 对于自定义的类
    • 单个:只能delete p,delete []p会出错(比如,死循环……)
    • 数组:delete []p绝对是对的,而delete p相当于delete p[0],只释放了第一个元素的内存(见下例)
#include <iostream>

using namespace std;



class S

{

    public:

    S(){cout << "Constructor" << endl;}

    ~S(){cout << "deconstructor" << endl;}

};



int main()

{

    S *s1 = new S[2];

    delete s1;

    

    S *s2 = new S[2];

    delete []s2;

}
View Code

运行结果:

Constructor
Constructor
deconstructor
Constructor
Constructor
deconstructor
deconstructor

 

malloc

原型:

void * malloc (size_t nbytes);

用法:

int* p = (int*)malloc(5*sizeof(int));

注意:malloc返回的是空指针,所以使用时需要进行转换,详见空指针与函数指针

 

calloc

原型:

void * calloc (size_t nelements, size_t size);

用法:

int *p = (int *) calloc (5, sizeof(int));

注意:malloccalloc除了参数不同之外,还有一点不同就是calloc 会将所有元素初始化为0

 

realloc

原型:

void * realloc (void * pointer, size_t size); 

用法:

int *q = realloc(p, 5*sizeof(int));

注意:第一个参数p是一个已经被分配内存的指针或空指针,第二个参数是总的字节数。这个函数可能需要改变内存块的地址以便能够分配足够的内存来满足新的长度要求。内存分配成功后,该函数将p指向的内容完整的复制到新的内存中并返回新的地址;若内存分配失败,则返回NULL指针,p和p指向的内容不变。

 

free

原型:

void free (void * pointer);

用法:

free(p);

注意:这个函数只能被用来释放由函数malloc, calloc 和realloc所分配的空间。

你可能感兴趣的:(内存分配)