TP框架网站的中英文切换怎么做,网页加速器排名,金融投资理财网站建设,图文广告设计制作软件目录
1. C内存分布
2. C 内存管理方式
2.1 new 和 delete 操作内置类型 2.2 new 和 delete 操作自定义类型
3. operator new与operator delete函数 4. new和delete的实现原理
5. malloc/free 和 new/delete 的区别 1. C内存分布
首先看一段代码#xff1a;
int globalV…目录
1. C内存分布
2. C 内存管理方式
2.1 new 和 delete 操作内置类型 2.2 new 和 delete 操作自定义类型
3. operator new与operator delete函数 4. new和delete的实现原理
5. malloc/free 和 new/delete 的区别 1. C内存分布
首先看一段代码
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;const 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);
}
那么看一下这几道题
选项: A.栈 B.堆 C.数据段(静态区) D.代码段(常量区)
globalVar在哪里____ staticVar在哪里____ num1 在哪里____staticGlobalVar在哪里____ localVar在哪里____
char2在哪里____ pChar3在哪里____ ptr1在哪里____*char2在哪里___ *pChar3在哪里____ *ptr1在哪里____
解答如下 这里的char2或者pChar3有问题可以主要参考一下这段代码
#include stdio.h
int main()
{char str1[] hello bit.;char str2[] hello bit.;const char* str3 hello bit.;const char* str4 hello bit.;if (str1 str2)printf(str1 and str2 are same\n);elseprintf(str1 and str2 are not same\n);if (str3 str4)printf(str3 and str4 are same\n);elseprintf(str3 and str4 are not same\n);return 0;
}
str1 和 str2 不一样因为这里的字符串都是拷贝来自常量区的字符串在栈种新开辟两个空间然而str3 和 str4 都同时指向 常量区相同的空间。 再来看几道指针题 sizeof(char2) __5__; strlen(char2) __4__; sizeof(pChar3) __4 or 8__; strlen(pChar3) __4 or 8__; sizeof(ptr1) __4 or 8__;
如果有问题可以参考一下我之前写的关于指针的文章
指针进阶一篇文章即可了解C指针所有内容-CSDN博客https://blog.csdn.net/m0_68617301/article/details/136449117 主要了解一下 sizeof 和 strlen 的区别 sizeof 是操作符而 strlen 是函数sizeof 是计算有多少字节在编译阶段就会被编译成汇编语言strlen 是计算字符串长度遇到 \0 就结束。 内存分布介绍 栈又叫堆栈--非静态局部变量/函数参数/返回值等等栈是向下增长的。内存映射段是高效的I/O映射方式用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存做进程间通信。堆用于程序运行时动态内存分配堆是可以上增长的。数据段--存储全局数据和静态数据。代码段--可执行的代码/只读常量。 2. C 内存管理方式
C语言内存管理方式在C中可以继续使用但有些地方就无能为力而且使用起来比较麻烦因 此C又提出了自己的内存管理方式通过new和delete操作符进行动态内存管理。
2.1 new 和 delete 操作内置类型
void Test()
{// 动态申请一个int类型的空间int* ptr4 new int;// 动态申请一个int类型的空间并初始化为10int* ptr5 new int(10);// 动态申请10个int类型的空间int* ptr6 new int[3];delete ptr4;delete ptr5;delete[] ptr6;
}
如果要是申请n块空间且要初始化
int main()
{int* a new int[10] {1,2,3,4,5,6}; // 剩下的空间就全是0cout a endl;return 0;
} 2.2 new 和 delete 操作自定义类型
例如创建链表的操作
struct ListNode
{
public:int _val;ListNode* _next;ListNode(int val):_next(nullptr),_val(val){}
};ListNode* CreateList(int n)
{ListNode* head new ListNode(-1);ListNode* tail head;int val;printf(请依次输入%d个节点的值, n);for (size_t i 0; i n; i){cin val;tail-_next new ListNode(val);tail tail-_next;}return head-_next;
}int main()
{ListNode* list CreateList(5);return 0;
}3. operator new与operator delete函数 概念new和delete是用户进行动态内存申请和释放的操作符operator new 和operator delete是系统提供的全局函数new在底层调用operator new全局函数来申请空间delete在底层通过operator delete全局函数来释放空间。operator new该函数实际通过malloc来申请空间当malloc申请空间成功时直接返回申请空间失败尝试执行空 间不足应对措施如果改应对措施用户设置了则继续申请否则抛异常。operator delete: 该函数最终是通过free来释放空间的。 operator new - C Reference (cplusplus.com)https://legacy.cplusplus.com/reference/new/operator%20new/?kwoperator%20newoperator delete - C Reference (cplusplus.com)https://legacy.cplusplus.com/reference/new/operator%20delete/?kwoperator%20delete这是官网给出的相关解释可供参考。 4. new和delete的实现原理
对于new来说 5. malloc/free 和 new/delete 的区别 malloc/free和new/delete的共同点是都是从堆上申请空间并且需要用户手动释放。不同的地方是 malloc和free是函数new和delete是操作符malloc申请的空间不会初始化new可以初始化malloc申请空间时需要手动计算空间大小并传递new只需在其后跟上空间的类型即可如果是多个对象[]中指定对象个数即可malloc的返回值为void*, 在使用时必须强转new不需要因为new后跟的是空间的类型malloc申请空间失败时返回的是NULL因此使用时必须判空new不需要但是new需要捕获异常申请自定义类型对象时malloc/free只会开辟空间不会调用构造函数与析构函数而new在申请空间后会调用构造函数完成对象的初始化delete在释放空间前会调用析构函数完成空间中资源的清理。