C++学习之new()和malloc()函数 |
您所在的位置:网站首页 › new和malloc的区别与联系 › C++学习之new()和malloc()函数 |
熟悉c++的朋友应该都知道,c++提供给了程序员与硬件打交道的可能性,比如说内存管理。一个高水平的c++程序员可以将c++程序的性能优化到极致,榨干硬件资源。而现在我想说说与内存管理有关的new 和 malloc()。 先说说malloc(),malloc是从C语言那里继承过来的一个函数,其用于分配一片内存,它的返回结果是一个指向你所需求的内存的指针,其函数原型和使用例子如下: /* 函数原型 其中__size是你要分配的大小,其单位是byte */ void* malloc(size_t __size); // 用例 int* pInt = (int*) malloc(sizeof(int)); // 分配了一个int double* pDoubleArray = (double*) malloc(sizeof(double) * 5); // 分配了一个double数组,其大小为5一般来说,malloc总是能为你分配出内存。但是也存在山穷水尽,内存不够用的情况。这时候malloc会返回一个空指针(NULL, nullptr)。当你使用malloc的时候,你最好每次都要判断一下返回的指针是否为空。 相关教程:C++视频教程 现在内存已经分配出来了。当程序运行到某一些时刻,我又不想要这些内存了。这时候我们就要手动释放内存,否则的话就会造成内存泄露。通过free() 函数来释放内存,其函数原型和使用例子如下: // 原型 void free(void* __ptr); // 用例 free(pInt); free(pDoubleArray);有趣的是你传给free函数的只是一个指针,然而不管你是分配了一个元素还是分配了一个数组,free总能帮你释放掉这些内存(free 怎么知道你分配的数组的大小?) 让我来详细的说说malloc在分配内存的时候干了什么。malloc在分配内存的时候,不仅仅会分配你需要的内存大小,它还会在你的内存的头部和尾部加上一些额外的信息(俗称cookie)。比如说用来DEBUG的信息和你的内存的大小。这就解释了为什么能free掉你的内存,因为它知道你这块内存是多大的。值得一提的是这些Cookie会占用一些内存。。。 好了,malloc已经介绍的差不多了。还想说的一点是malloc只是一个第三方的函数,并不是操作系统的内核函数。如果有额外的需求的话,你可以设计自己的malloc。接下来谈谈new。 new是c++提供的一个操纵符(或者说关键字)。其也是用于分配内存的。其用例如下: int* pInt = new int(3); // 分配并构造一个int double* pDoubleArray = new double[5]; // 分配了一个double数组,其大小是5 delete pInt; // 删除单元素 delete[] pDoubleArray; // 删除数组还是老话题,一般来说程序是能为你分配出内存的,但是实在山穷水尽了怎么办?这时候程序就会抛出一个std::bad_alloc异常。注意,这是new 和 malloc 的区别之一。但是难能可贵的是C++提供了一个机制来处理bad_alloc异常,其做法如下: void BadAllocateHandler() { std::cout |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |