您的位置:首页 > 文旅 > 旅游 > 建设工程管理是干嘛的_淘宝官网网页版_手机百度快照_2023年6月疫情恢复

建设工程管理是干嘛的_淘宝官网网页版_手机百度快照_2023年6月疫情恢复

2025/1/7 19:27:45 来源:https://blog.csdn.net/2301_79814410/article/details/144165032  浏览:    关键词:建设工程管理是干嘛的_淘宝官网网页版_手机百度快照_2023年6月疫情恢复
建设工程管理是干嘛的_淘宝官网网页版_手机百度快照_2023年6月疫情恢复

1. C/C++内存分布

在这里插入图片描述
在这里插入图片描述

globalVal 是全局变量,在静态区 C
staticGlobalVar 是全局的静态变量,在静态区 C
staticVar 是局部的静态变量,在静态区 C
localVar 是局部变量,在栈,具体来说是在栈帧里面 A
num1 是一个局部数组,在栈 A
char2 是一个局部数组,在栈 A,它里面的数据abcd,是从常量区里面拷贝来的,‘abcd’都是在栈,所以char2 是‘a’,在栈 A
pchar3 是一个指针,在栈 A,它指向常量区里面的内容‘abcd’,所以
pchar3是在常量区,D
ptr1 是一个指针,在栈 A,它指向在堆上开辟的一段空间,所以*ptr1是在堆上,B
在这里插入图片描述

填空题:
在这里插入图片描述

在这里插入图片描述

2. C语言中动态内存管理方式

void Test ()
{int* p1 = (int*) malloc(sizeof(int));free(p1);// 1.malloc/calloc/realloc的区别是什么?//calloc = malloc + memset 申请空间+初始化//realloc 是重新调整空间,异地扩容 or 原地扩容int* p2 = (int*)calloc(4, sizeof (int));int* p3 = (int*)realloc(p2, sizeof(int)*10);// 这里需要free(p2)吗? 不需要 因为realloc返回新的空间首地址free(p3 );
}

3. C++中动态内存管理

3.1 基础语法:

在这里插入图片描述

    // malloc没有办法很好支持动态申请的自定义对象初始化A* p1 = (A*)malloc(sizeof(A));//p1->_a = 0;//p1->A(1);// 自定义类型,开空间+调用构造函数初始化A* p2 = new A;A* p3 = new A(3);// 自定义类型,调用析构函数+释放空间delete p2;delete p3;A* p4 = new A[10];delete[] p4;A aa1(1);A aa2(2);A* p5 = new A[10]{aa1, aa2};delete[] p5;A* p6 = new A[10]{ A(1), A(2)};delete[] p6;A* p7 = new A[10]{ 1, 2 };delete[] p7;

在这里插入图片描述

3.2

在这里插入图片描述
func函数中new了一个stack类,先开空间,再调用构造函数,构造函数里面又会new一个数组,new了两次;返回stack类的指针,delete时,先调用析构函数 ,将stack类里面的数组成员delete,然后再将stack类delete;
如果主函数没有delete,那么ptr是内置的指针类型,不会去调用析构函数,数组的空间泄露,到程序结束,stack类开辟的空间被释放。

4. operator new与operator delete函数

operator new 的用法和malloc 是一样的,区别是malloc失败之后会返回0,而operator new 会抛出异常,如果有try 和 catch语句的话,就执行。如果没有try 和 catch语句的话,程序崩溃。
其实,operator new 是为了之后的new做铺垫。
operator new 是对malloc的封装
同理 operator delete 是对 free 的封装
在这里插入图片描述

异常操作语法大致如下:

void func()
{char* p1 = new char[0x7fffffff]; //内存会开辟失败cout << "hello world" << endl;
}int main()
{try{func();}catch (const exception& e){cout << e.what() << endl;}return 0;
}

4.1

在这里插入图片描述
改成cout << p1 << endl;就不行了。除了char* 的其他的指针类型,cout打印的时候,打印的就是指针,也就是地址。而char* 类型的指针不一样,编译器会当他是字符串,打印的是它的内容,所以应该强转:(void*)p1 or (int*)p1。

5. new和delete的实现原理

在这里插入图片描述在这里插入图片描述

在这里插入图片描述===================================

在这里插入图片描述
结论:一定要匹配使用!!!

6. 定位new表达式(placement-new)

和内存池搭配用
有时候不直接从堆上申请空间,因为效率速度不高,从内存池上取空间,这时候不会调用构造函数,就需要定位new 来显式调用构造函数

在这里插入图片描述

7. 常见面试题在这里插入图片描述

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com