malloc()函数(memory allocation)
分配指定长度的内存块。如果分配成功则返回指向被分配内存的指针,分配失败返回NULL。当内存不再使用时,应使用free()函数将内存块释放,防止内存泄漏。返回类型是void*类型。void*表示未确定类型的指针,即申请内存空间时还不知道存储什么类型的数据。C,C++规定,void*类型可以强制转换为任何其它类型的指针。
申请了内存空间后,必须检查是否分配成功。使用完毕需要释放;释放后应该把指向这块内存的指针置成NULL,防止程序再次使用该指针。释放只能一次,如果释放两次及两次以上会出现错误(释放空指针例外,释放空指针其实也等于啥也没做,所以释放空指针释放多少次都没有问题)。
malloc是从堆上获得内存空间。也就是说函数返回的指针是指向堆里面的一块内存。操作系统中有一个记录空闲内存地址的链表。当操作系统收到程序的申请时,就会遍历该链表,然后就寻找第一个空间大于所申请空间的堆结点,然后就将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。
new运算符
C++中,用new和delete动态创建和释放数组或单个对象。动态创建的对象可以用初始化变量的方式初始化。
int *pi=newint(100); //指针pi所指向的对象初始化为100
如果不提供显示初始化,对于类类型,用该类的默认构造函数初始化;而内置类型的对象则无初始化。
new分配失败时,返回什么?
1993年前,c++一直要求在内存分配失败时operator new要返回0,现在则是要求operator new抛出std::bad_alloc异常。很多c++程序是在编译器开始支持新规范前写的。c++标准委员会不想放弃那些已有的遵循返回0规范的代码,所以他们提供了另外形式的operator new(以及operator new[])以继续提供返回0功能。这些形式被称为“无抛出”,因为他们没用过一个throw,而是在使用new的入口点采用了nothrow对象:
widget *pw1 = new widget;// 分配失败抛出std::bad_alloc
if (pw1 == 0) // 这个检查一定失败
widget *pw2 = new(nothrow) widget; // 若分配失败返回0
if (pw2 == 0) // 这个检查可能会成功
malloc和new的区别
malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。
n