目录
(2)malloc/new最大能申请多大的空间?如何malloc出4G的空间?
下面看一段代码
- int globalVar = 1;
- static int staticGlobalVar = 1;
- void Test()
- {
- static int staticVar = 1;
- int localVar = 1;
-
- int num1[10] = { 1, 2, 3, 4 };
- char char2[] = "abcd";
- char* pChar3 = "abcd";
- int* ptr1 = (int*)malloc(sizeof(int) * 4);
- int* ptr2 = (int*)calloc(4, sizeof(int));
- int* ptr3 = (int*)realloc(ptr2, sizeof(int) * 4);
- free(ptr1);
- free(ptr3);
- }
- //globalVar静态区 staticGlobalVar静态区 staticVar静态区 localVar栈区
- //num1栈区(是数组) char2栈区(是数组,首元素地址) *char2栈区(是首元素),注意:char2并不是常量字符串,"abcd"才是,而char2是将"abcd"拷贝了一份,在栈区
- //pChar3栈区(是指针) *pChar3常量区(是常量字符串)
- //ptr1栈区(是指针) *ptr1堆区

new/delete和malloc/free 针对内置类型没有任何差别,只是用法不一样
- // 申请一个10个int的数组
- int* p1 = (int*)malloc(sizeof(int) * 10);
- int* p2 = new int[10];// new/delete new[]/delete[]一定要匹配,否则可能会出错
- free(p1);
- delete[] p2;//这里不要忘了[]
-
- // 申请单个int对象
- int* p3 = (int*)malloc(sizeof(int));
- int* p4 = new int;
- free(p3);
- delete p4;
对于自定义类型,new和delete会开辟空间+初始化,析构+释放空间
malloc/free只开辟空间,释放空间
- struct ListNode
- {
- ListNode* _next;
- ListNode* _prev;
- int _val;
-
- ListNode(int val = 0): _next(nullptr), _prev(nullptr), _val(val)
- {
- cout << "ListNode(int val = 0)" << endl;
- }
- ~ListNode()
- {
- cout << "~ListNode()" << endl;}
- };
-
- int main()
- {
- //C malloc只是开空间 free释放空间
- struct ListNode* n1 = (struct ListNode*)malloc(sizeof(struct ListNode));
- free(n1);
- //C++ new 针对自定义类型,开空间+构造函数初始化
- //delete 针对自定义类型,析构函数清理 + 释放空间
- ListNode* n2 = new ListNode(5); // -> 相当于c语言中BuyListNode(5)
- delete n2;
-
- //申请数组
- struct ListNode* arr3 = (struct ListNode*)malloc(sizeof(struct ListNode)*4);
- free(arr3);
- ListNode* arr4 = new ListNode[4]{1,2,3,4};//数组初始化可以用{}
- delete[] arr4;
-
- 那么,new内置类型的时候也可以进行初始化
- //int* p1 = new int(0);
- //int* p2 = new int[4]{ 1, 2, 3, 4 };
- }
new = operator new(库函数) + 构造函数
operator new = malloc + 失败抛异常机制
其实operator new和malloc用法是完全一样的,功能都是在堆上申请释放空间,只是失败了处理方式不一样,malloc失败返回NULL,operator new失败以后抛异常
相同点:都是从堆上申请空间,并且需要用户手动释放。
区别:
32位下面,最多2G左右; 在64位下面申请