东莞微信网站建设推荐中国做的最好的网站有哪些

当前位置: 首页 > news >正文

东莞微信网站建设推荐,中国做的最好的网站有哪些,怎么网站后台,在微信上怎么做网站【小梦C嘎嘎——启航篇】内存管理小知识#x1f60e; 前言#x1f64c;malloc/calloc/realloc的区别#xff1f;new 与 deletenew与delete要找好搭档才能保证万无一失 new 与 delete的内部实现细节是怎么样的呢#xff1f;#xff1f;#xff1f;new 的内部实现细节dele… 【小梦C嘎嘎——启航篇】内存管理小知识 前言malloc/calloc/realloc的区别new 与 deletenew与delete要找好搭档才能保证万无一失 new 与 delete的内部实现细节是怎么样的呢new 的内部实现细节delete的内部实现细节 经典问题malloc/free 与new/delete 的区别是什么抛异常的基本使用 小知识点cout 流插入 不能打印出char指针的地址 总结撒花 博客昵称博客小梦 最喜欢的座右铭全神贯注的上吧 作者简介一名热爱C/C算法等技术、喜爱运动、热爱K歌、敢于追梦的小博主 博主小留言哈喽各位CSDN的uu们我是你的博客好友小梦希望我的文章可以给您带来一定的帮助话不多说文章推上欢迎大家在评论区唠嗑指正觉得好的话别忘了一键三连哦 前言 哈喽各位友友们我今天又学到了很多有趣的知识现在迫不及待的想和大家分享一下 都是精华内容可不要错过哟 malloc/calloc/realloc的区别 这是一个经典的问题有时面试也会这么问你。我的理解是malloc可以向堆区动态申请一段连续的空间realloc 的话主要是完成扩容操作其扩容又可以分为两种方式1.原地扩容 2.异地扩容。异地扩容的代价比较高因为它要在堆区去找一块能够满足需求的空间然后将原来的数据内容拷贝到新申请的空间里面然后再把原来申请的空间释放掉。而calloc的话就是在malloc的基础上能够将自己申请的空间进行初始化操作。以上就是他们三者的区别与联系啦~ new 与 delete 在C语言中我们知道有malloc realloccalloc 这些可以在堆区中申请资源可以用free释放掉堆上开辟的空间。那为什么C还自己搞一套呢不要问C嘎嘎祖师爷那么设计一定有他的道理接下来我就来分析一下为什么。 new与delete要找好搭档才能保证万无一失 由于我们场景需求的多样因此new与delete产生了不同的搭档方式以满足我们的需求。简单概括为 一个变量空间的申请与释放new 变量类型(val) —– delete 变量名一个变量空间的申请与释放new 变量类型【变量个数】(val) —– delete【】 变量名 #includeiostream using namespace std;class A { public:A(int a 0):_a(a){cout A(int a 0) endl;}~A(){cout ~A() endl;} private:int _a; };int main() {int a new int(10);cout a endl;delete a;A ptr1 new A[10];delete[] ptr1;return 0; } new与delete要找好搭档才能保证万无一失如果随意搭档可能会出错的。例如下面这个场景就会导致运行错误。 class A { public:A(int a 0):_a(a){cout A(int a 0) endl;}~A(){cout A() endl;} private:int _a; };int main() {int* a new int(10);cout a endl;A ptr1 new A[10];delete ptr1;//delete[] ptr1;return 0; } 因此我们在使用的时候一定要根据场景的需求去选择new 与 delete 的 匹配搭档。 new 与 delete的内部实现细节是怎么样的呢 new 的内部实现细节 其实new 之所以可以申请空间并且完成初始化操作其实其内部是调用了 malloc 和 构造函数来实现的。那它们又是怎么调用malloc和构造的呢内部实现的细节是怎么样的 其实这里使用了封装的方法其内部实现是写了一个operator new函数这个函数里面封装了malloc函数的调用以及抛异常的实现。因此operator new函数就完成了new的开空间和如果new失败了会抛异常的功能。然后调用new编译器会自动调用构造函数进行对象的初始化操作。 delete的内部实现细节 其实delete之所以可以释放空间并且完成对象资源清理的工作其实其内部是调用了free函数 和 析构函数来实现的。那它们又是怎么调用free函数 和 析构函数的呢内部实现的细节是怎么样的 其实这里也使用了封装的方法其内部实现是写了一个operator delete函数这个函数里面封装了free函数的调用。因此operator delete函数就完成了对象资源的释放。然后调用delete编译器会自动调用析构函数进行对象空间的释放。 从他们内部实现的细节可以看出如果只是对内置类型变量那么使用malloc free 与使用 new delete 都可以完成空间的开辟和释放。但是对于自定义类型就只能用newdelete。最主要的原因就是new和delete会自动调用构造函数和析构函数而malloc和free不能。 经典问题malloc/free 与new/delete 的区别是什么 我的理解是 从语法角度上看 malloc free是函数而new与delete是操作符。malloc需要自己手动计算所要申请空间的大小而new直接加类型然后在后面【】里面写上对象个数即可。malloc 返回的是vold指针需要强转而new不用返回的就是该对象类型的指针。malloc开辟失败是会返回NULL,我们需要自己写一个检查代码来判断是否开辟失败而new开辟失败会抛出异常无需我们写检查代码。malloc只能完成申请空间的功能而new既可以申请空间又可以进行初始化。 从底层原理实现的角度上看 申请自定义类型对象时malloc/free只会开辟空间不会调用构造函数与析构函数而new 在申请空间后会调用构造函数完成对象的初始化delete在释放空间前会调用析构函数完成 空间中资源的清理
抛异常的基本使用 C中的new有抛异常的功能。而trycatch则可以去捕获new抛出的异常。 首先需要将要检查的代码放在try里面或者在这里面进行调用才能够对该代码段进行异常的检查和捕获。一旦捕获到异常就会自动跳转到catch里面然后进行异常的处理。下面是一个在32位平台上的应用举例 void func() {char
p1 new char[0x7fffffff];cout (void*)p1 endl;cout hello world endl; }int main() {try{func();}catch (const exception e){cout e.what() endl;}return 0; }运行结果截图 小知识点cout 流插入 不能打印出char*指针的地址 原因cout 会自动识别其为字符串并按照字符串的格式进行打印遇到/0就会结束打印。 解决方案将其强转为其他类型即可解决。 错误代码 程序运行结果 修改后的代码 运行结果 总结撒花 希望大家通过阅读此文有所收获    如果我写的有什么不好之处请在文章下方给出你宝贵的意见。如果觉得我写的好的话请点个赞赞和关注哦