专业的建设企业网站工厂管理软件哪个好
- 作者: 五速梦信息网
- 时间: 2026年04月20日 05:05
当前位置: 首页 > news >正文
专业的建设企业网站,工厂管理软件哪个好,内容管理系统有哪些,网站多次提交目录 1.C/C的内存分布 2.C语言中动态内存管理方式#xff1a;malloc、calloc、realloc、free 3.C内存管理方式 3.1 new/delete操作内置类型 3.2 new 和 delete操作自定义类型 4.operator new 与 operator delete 函数#xff08;重要点#xff09; 4.1 operator new 与…目录 1.C/C的内存分布 2.C语言中动态内存管理方式malloc、calloc、realloc、free 3.C内存管理方式 3.1 new/delete操作内置类型 3.2 new 和 delete操作自定义类型 4.operator new 与 operator delete 函数重要点 4.1 operator new 与 operator delete函数重点 4.2 重载 operator new 与operator delete(了解) 5.new 和 delete 的实现原理 5.1 内置类型 5.2 自定义类型
- 定位 new 表达式placement-new(了解) 7.常见面试题 7.1 malloc / free 和 new / delete 的区别 7.2 内存泄漏 7.2.1什么式内存泄漏内存泄漏的危害 7.2.2 内存泄漏的危害 7.2.3 如何检测内存泄漏了解 7.2.4 如何避免内存泄漏 1.C/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); }1. 选择题 选项: A.栈 B.堆 C.数据段(静态区) D.代码段(常量区) globalVar在哪里C // 全局变量全局变量和静态数据存放在 数据段静态区 staticGlobalVar在哪里C // 静态数据全局变量和静态数据段存放在 数据段静态区 staticVar在哪里C // 静态数据全局变量和静态数据段存放在 数据段静态区 localVar在哪里A //局部变量 局部变量和函数存放在栈 num1 在哪里A //局部变量 局部变量和函数存放在栈 char2在哪里A //局部变量 局部变量和函数存放在栈 *char2在哪里A_ //局部变量 局部变量和函数存放在栈 pChar3在哪里A__ //pChar3是一个指针变量存储abcd的地址属于局部变量 局部变量和函数存放在栈 *pChar3在哪里D //pChar3是一个指针变量,存储abcd的地址解引用后找到abcdabcd\0存储在常量区。 ptr1在哪里A //ptr1是一个指针变量存储malloc的地址属于局部变量 局部变量和函数存放在栈 *ptr1在哪里B //ptr1是一个指针变量存储malloc的地址解引用后拿到malloc的内容该内容存放在堆区。2. 填空题 sizeof(num1) 40; //sizeof(数组名),求该数组的大小4 * 10 40 sizeof(char2) 5; //sizeof(数组名),求该数组的大小abcd abcd\0 一共5个元素1 * 5 5 strlen(char2) 4; //strlen()是库函数求字符串长度abcd一共4个元素。 sizeof(pChar3) 4⁄8__;//pChar3是一个指针变量指针变量的大小受操作系统影响4/8 strlen(pChar3) 4; //strlen()是库函数求字符串长度abcd一共4个元素。 sizeof(ptr1) 4⁄8; //ptr1是一个指针变量指针变量的大小受操作系统影响4/83. sizeof 和 strlen 区别 sizeof()是操作符求取变量的大小 strlen()是函数求的是字符串的长度需要注意字符串一般末尾有\0作为结束标识符。【说明】 栈又叫堆栈–非静态局部变量/函数参数/返回值等等栈是向下增长的。内存映射段–高效的IO映射方式用于装载一个共享的动态内存库用户可使用系统接口创建共享内存做进程间通信Linux部分会详细讲解堆–用于程序运行时动态内存分配堆是向上增长。数据段–存储全局变量和静态数据。代码段–可执行的代码/只读常量。 2.C语言中动态内存管理方式malloc、calloc、realloc、free void Test () {int* p1 (int) malloc(sizeof(int));free(p1);// 1.malloc/calloc/realloc的区别是什么int p2 (int)calloc(4, sizeof (int));int p3 (int*)realloc(p2, sizeof(int)*10);// 这里需要free(p2)吗/不需要realloc扩容方式分为两种原地扩容地址不改变。新位置扩容copy原位置的内容给到新位置返回新位置的地址。/free(p3 ); } 面试题 1.malloc/calloc/realloc的区别 malloc申请的空间没有初始化直接返回起始地址。 calloc申请的空间会把空间初始化为0然后返回起始地址。 realloc是对已经开辟好的空间进行扩容扩容方式分为两种 原地扩容地址不改变。 新位置扩容copy原位置的内容给到新位置返回新位置的地址。 2.malloc的实现原理 【CTF】GLibc堆利用入门-机制介绍_哔哩哔哩_bilibili 3.C内存管理方式 C语言内存管理方式在C中可以继续使用但是有些地方就无能为力而且使用起来比较麻烦因此C又提出了自己的内存管理方式通过new和delete操作符进行动态内存管理。 3.1 new/delete操作内置类型 #includeiostream using namespace std; int main() {//动态申请一个int类型的空间//C int* p1 (int)malloc(sizeof(int));free(p1);//CPPint p2 new int;delete p2;//动态申请10个int类型的空间//Cint* p3 (int*)malloc(sizeof(int) * 10);free(p3);//CPPint* p4 new int[10];delete[] p4;//动态申请一个int类型的空间并初始化为10//CPPint* p5 new int(10);cout p5; p5 endl;delete p5;//动态申请一个int类型的数组空间并初始化为{123,0}//CPPint p6 new int[10] {1,2,3,0};for (int i 0; i 10; i){cout p6; (p6i) endl;}delete[] p6;return 0; } 注意申请和释放单个元素的空间使用new和delete操作符申请和释放连续的空间使用new[] 和 delete[]。注意匹配起来使用。 3.2 new 和 delete操作自定义类型 class A { public:A(int a 0):_a(a){cout A() this endl;}~A(){cout ~A() this endl;} private:int _a; }int main() {//new / delete 和 malloc / free最大的区别是 new /delete 对于【自定义类型还】除了开辟空间还会调用构造函数和析构函数A p1 (A)malloc(sizeof(A));A p2 new A(1);free(p1);delete p2;//内置类型几乎是一样的int* p3 (int)malloc(sizeof(int));//Cint p4 new int;free(p3);delete p4;A* p5 (A*)malloc(sizeof(A)10);A p6 new A[10];free(p5);delete[] p6;return 0; } 注意在申请自定义类型的空间时new会调用构造函数delete 会调用析构函数而malloc和free不会。 【面试题】 1.C语言malloc\free 与Cnew、delete 的区别 动态申请内置类型的数据new / malloc 除了用法上面其他没有什么区别。 动态申请自定义类型的数据new / malloc 除了用法上面new会调用构造函数初始化delete会调用析构函数清理。 4.operator new 与 operator delete 函数重要点 4.1 operator new 与 operator delete函数重点 new 和 delete 是用户进行动态内存申请和释放的操作符operator new 和 operator delete 是系统提供的全局函数new在底层调用了operator new 全局函数来申请空间delete在底层通过operator delete全局函数来释放空间。 /* operator new该函数实际通过malloc来申请空间当malloc申请空间成功时直接返回申请空间 失败尝试执行空 间不足应对措施如果改应对措施用户设置了则继续申请否 则抛异常。 */ void *CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc) {// try to allocate size bytesvoid p;while ((p malloc(size)) 0)if (_callnewh(size) 0){// report no memory// 如果申请内存失败了这里会抛出bad_alloc 类型异常static const std::bad_alloc nomem;_RAISE(nomem);}return (p); }/ operator delete: 该函数最终是通过free来释放空间的 */ void operator delete(void *pUserData) {_CrtMemBlockHeader * pHead;RTCCALLBACK(_RTC_Free_hook, (pUserData, 0));if (pUserData NULL)return;_mlock(_HEAP_LOCK); /* block other threads */TRY/* get a pointer to memory block header /pHead pHdr(pUserData);/ verify block type /_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead-nBlockUse));_free_dbg( pUserData, pHead-nBlockUse );//——————————__FINALLY_munlock(_HEAP_LOCK); / release other threads /__END_TRY_FINALLYreturn; }/ free的实现 / #define free(p) _free_dbg(p, _NORMAL_BLOCK)//—————————– 通过上述两个全局变量的实现operator new 实际也是通过malloc来申请空间的如果malloc申请空间成功就直接返回否则执行用户提供的空间不足应对措施如果用户提供该措施就继续申请否则就抛异常。operator delete 最终是通过free来释放空间的。 4.2 重载 operator new 与operator delete(了解) 注意一般情况下不需要对operator new 和 operator delete进行重载除非在申请和释放空间的时候有某些特殊的需求。比如在使用new和delete申请空间和释放空间时打印一些日志信息可以帮助用户来检测时候存在内存泄漏。 // 重载operator delete在申请空间时打印在哪个文件、哪个函数、第多少行申请了多少个 字节 void operator new(size_t size, const char* fileName, const char* funcName, size_t lineNo) {void* p ::operator new(size);cout fileName - funcName - lineNo - p - size endl;return p; } // 重载operator delete在释放空间时打印再那个文件、哪个函数、第多少行释放 void operator delete(void* p, const char* fileName, const char* funcName, size_t lineNo) {cout fileName - funcName - lineNo - p endl;::operator delete(p); } int main() {// 对重载的operator new 和 operator delete进行调用int* p new(FILE, FUNCTION, LINE) int;operator delete(p, FILE, FUNCTION, LINE);return 0; } // 上述调用显然太麻烦了可以使用宏对调用进行简化 // 只有在Debug方式下才调用用户重载的 operator new 和 operator delete #ifdef _DEBUG #define new new(FILE, FUNCTION, LINE) #define delete(p) operator delete(p, FILE, FUNCTION, LINE) #endif int main() {int* p new int;delete(p);return 0; } 5.new 和 delete 的实现原理 5.1 内置类型 如果申请的是内置类型的空间new 和 malloc,delete 和free 基本相似不同的地方是new / delete 申请和释放的是首个元素的空间new[] 和 delete[] 申请的是连续空间而且new在申请空间失败时会抛异常malloc会返回NULL 5.2 自定义类型 new的原理 调用operator new 函数申请空间在申请的空间上执行构造函数完成对象的构造delete 的原理 在空间上执行析构函数完成对象中资源的清理工作调用operator delete 函数释放对象的空间new T[N]的原理 调用operator new[] 函数在operator new[] 中实际调用operator new 函数完成对N 个对象空间的申请在盛情的空间上执行N次构造函数delete[] 的原理 在释放的对象空间上执行N次析构函数完成N个对象中资源的清理调用operator delete[] 释放空间。实际在operator delete[] 中调用 operator delete 来释放空间。
- 定位 new 表达式placement-new(了解) 定位new表达式是在已分配的原始内存空间中调用构造函数初始化一个对象。 使用格式 new(place_address)type 或者 new(place_address)type(initializer-list)place_address 必须是一个指针initializer-list是类型的初始化列表 使用场景 定位 new 表达式在实际中一般是配和内存池使用因为内存池分配出的内存没有初始化所以如果是自定义类型的对象需要使用new的定义表达式进行显示调用构造函数进行初始化。 class A { public:A(int a 0): _a(a){cout A(): this endl;} ~A(){cout ~A(): this endl;} private:int _a; }; // 定位new/replacement new int main() {// p1现在指向的只不过是与A对象相同大小的一段空间还不能算是一个对象因为构造函数没有执行A* p1 (A)malloc(sizeof(A));new(p1)A; // 注意如果A类的构造函数有参数时此处需要传参p1-~A();free(p1);A p2 (A)operator new(sizeof(A));new(p2)A(10);p2-~A();operator delete(p2);return 0; } 7.常见面试题 7.1 malloc / free 和 new / delete 的区别 7.2 内存泄漏 7.2.1什么式内存泄漏内存泄漏的危害 什么式内存泄偶 内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况内存泄漏并不是指内存在物理上的消失而是应用程序分配某段内存后因为设计失误失去了对该段内存的控制因而造成了内存的浪费。 内存泄漏的危害 长期运行的程序出现内存泄漏影响很大如操作系统后台服务等等出现内存泄漏会导致响应越来越慢最终卡死。 void MemoryLeaks() {// 1.内存申请了忘记释放int p1 (int)malloc(sizeof(int));int p2 new int;// 2.异常安全问题int* p3 new int[10];Func(); // 这里Func函数抛异常导致 delete[] p3未执行p3没被释放.delete[] p3; } 7.2.2 内存泄漏的危害 C/C程序中一般我们关心两种方面的内存泄漏 堆内存泄漏 堆内存指的是程序执行中依据要分配通过malloc / calloc / realloc / new 等从堆中分配的一块内存用完后必须通过调用相应的 free 或者 delete 删掉。假设程序的设计错误导致这部分内存没有被释放那么以后这部分空间将无法被使用就会产生Heap Leak。 系统资源泄漏 指程序使用系统分配的资源比如套接字、文件描述符、管道等没有使用对应的函数释放掉导致系统资源的浪费严重可导致系统效能减少系统执行不稳定。 7.2.3 如何检测内存泄漏了解 在vs下可以使用windows操作系统提供的 _CrtDumpMemoryLeaks() 函数进行简单检测该函数只报出了大概泄漏了多少个字节没有其他更准确的位置信息。 int main() {int* p new int[10];// 将该函数放在main函数之后每次程序退出的时候就会检测是否存在内存泄漏_CrtDumpMemoryLeaks();return 0; }// 程序退出后在输出窗口中可以检测到泄漏了多少字节但是没有具体的位置 Detected memory leaks! Dumping objects - {79} normal block at 0x00EC5FB8, 40 bytes long. Data: CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD Object dump complete. 因此写代码时一定要小心尤其是动态内存操作时一定要记着释放。但有些情况下总是防不胜防简单的可以采用上述方式快速定位下。如果工程比较大内存泄漏位置比较多不太好查时一般都是借助第三方内存泄漏检测工具处理的。 在linux下内存泄漏检测Linux下几款C程序中的内存泄露检查工具在windows下使用第三方工具:VS编程内存泄漏其他工具https://www.cnblogs.com/liangxiaofeng/p/4318499.html 7.2.4 如何避免内存泄漏 工程前期良好的设计规范养成良好的编码规范申请的内存空间记者匹配去释放。ps 这个理想状态。但是如果碰上异常时就算注意释放了还是可能会出问题。需要下一条智 能指针来管理才有保证。采用RAII思想或者智能指针来管理资源。有些公司内部规范使用内部实现的私有内存管理库。这套库自带内存泄漏检测的功能选项。出问题了使用内存泄漏工具检测。ps不过很多工具都不够靠谱或者收费昂贵。 总结一下:内存泄漏非常常见解决方案分为两种 1、事前预防型。如智能指针等。 2、事后查错型。如泄漏检测工具。
- 上一篇: 专业的建设机械网站制作不提供花架子网站 我
- 下一篇: 专业的临沂网站优化网站开发大赛发言稿
相关文章
-
专业的建设机械网站制作不提供花架子网站 我
专业的建设机械网站制作不提供花架子网站 我
- 技术栈
- 2026年04月20日
-
专业的广州手机网站建设开发国外优惠卷网站如何做
专业的广州手机网站建设开发国外优惠卷网站如何做
- 技术栈
- 2026年04月20日
-
专业的个人网站建设苏州运营推广网站建设
专业的个人网站建设苏州运营推广网站建设
- 技术栈
- 2026年04月20日
-
专业的临沂网站优化网站开发大赛发言稿
专业的临沂网站优化网站开发大赛发言稿
- 技术栈
- 2026年04月20日
-
专业的临沂网站优化现在室内设计师好做吗
专业的临沂网站优化现在室内设计师好做吗
- 技术栈
- 2026年04月20日
-
专业的南京网站建设防止访问网站文件夹
专业的南京网站建设防止访问网站文件夹
- 技术栈
- 2026年04月20日
