提升学历机构石家庄手机端seo
web/
2025/10/4 11:23:06/
文章来源:
提升学历机构,石家庄手机端seo,抖音小程序电脑上怎么打开,网站建设和信息更新的通知点击蓝字关注我们来源于网络#xff0c;侵删1.C/C内存分布虚拟地址空间分布#xff1a;由C/C编译的程序占用的内存分为以下几个部分#xff1a;栈区#xff08;stack#xff09;— 由编译器自动分配释放 #xff0c;存放为运行函数而分配的局部变量、函数参数、返回数据、…点击蓝字关注我们来源于网络侵删1.C/C内存分布虚拟地址空间分布由C/C编译的程序占用的内存分为以下几个部分栈区stack— 由编译器自动分配释放 存放为运行函数而分配的局部变量、函数参数、返回数据、返回地址等。其操作方式类似于数据结构中的栈。堆区heap — 一般由程序员分配释放 若程序员不释放程序结束 时可能由OS回收 。分配方式类似于链表。全局区静态区static—存放全局变量、静态数据、常量。程序结束后由系统释放。文字常量区 —常量字符串就是放在这里的。程序结束后由系统释放。程序代码区—存放函数体类成员函数和全局函数的二进制代码。这里主要讲C/C在堆上的动态分配方式。2.C语言动态内存分配申请内存malloc、calloc、realloc。释放内存free。 1mallocvoid *malloc(unsigned int size)开辟一块长度为size的连续内存空间返回类型为void类型的指针。在使用malloc开辟一段空间时void*要显示的转换为所需要的类型如果开辟失败则返回NULL指针。2callocvoid* calloc (size_t num, size_t size)开辟一块num个大小为size的连续空间并将每一块空间初始化为0。3reallocvoid *realloc(void *ptr,size_t size)将内存地址为ptr的一段空间的大小调整为size大小。如果ptr这段空间后面有足够的空间就直接追加上来如果ptr后面的空间不足则在堆上重新开辟一块合适大小的连续空间将原有数据拷贝到新的内存空间中释放掉原来的内存最后返回的则是新地址。4freevoid free (void* ptr)free函数是来释放动态开辟的内存的。malloc和free要配套使用如果没有free则会造成内存泄漏。3.C语言动态内存代码示例#include stdio.hint a 0; //a在全局已初始化数据区
char *p1; //p1在bss段未初始化全局变量
int main()
{int b; //b在栈区char s[] abc; //s为数组变量内容存储在栈区char *p1p2; //p1、p2在栈区char *p3 123456; //123456\0是字符串常量而p3在栈区 static int c 0//C为静态数据存在于已初始化数据区另外静态数据会自动初始化p1 (char*)malloc(10); //分配得来的10个字节的区域在堆区p2 (char*)malloc(20); //分配得来的20个字节的区域在堆区free(p1);free(p2);return 0;
}4.C动态内存分配申请内存new。释放内存delete。1newnew做的事调用operator new分配空间调用构造函数初始化空间//正确申请
Obj *objects new Obj[100]; // 创建100个动态对象
//错误申请
Obj *objects new Obj[100](1);// 创建100个动态对象的同时赋初值1operator new/*
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);
}2deletedelete做的事调用析构函数清理对象调用operator delete释放空间// 正确的用法
delete []objects;
// 错误的用法
delete objects; //相当于 delete objects[0]漏掉了另外 99 个对象。operator delete/*
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;
}5.C动态内存代码示例int a 0; //全局初始化区
char *p1; //全局未初始化区int main()
{
int b; //栈
char s[] /abc/; //栈
char *p2; //栈
char *p3 /123456/; //123456//0在常量区p3在栈上。
static int c 0;//全局静态初始化区
p1 new char[10];
p2 new char[20];
//分配得来得和字节的区域就在堆区。
}6.new/delete和malloc/free的异同相同点new、delete、malloc、free 都是从堆上开辟空间并且需要用户手动释放。不同点new和delete是操作符malloc和free是函数。malloc申请空间不会进行初始化new申请空间可以初始化。malloc申请空间失败返回NULLnew申请空间失败会抛出异常。针对自定义类型new和delete会自动调用构造函数和析构函数处理。有了malloc/free为什么还要new/delete?new运算不需要进行强制类型转换使用简单方便new运算是通过调用构造函数初始化动态创建的对象执行效率更高使用new能够进行异常处理使用更安全7.动态内存常见问题–内存泄露程序执行中依据须要分配通过malloc / calloc / realloc / new等从堆中分配的一块内存,用完后必须通过调用相应的 free或者delete 删掉。假设程序的设计错误导致这部分内存没有被释放那么以后这部分空间将无法再被使用就会产生堆内存泄漏。假设程序的设计错误导致这部分内存没有被释放那么以后这部分空间将无法再被使用就会产生Heap Leak。1内存泄漏有什么危害长期运行的程序出现内存泄漏影响很大如操作系统、后台服务等等出现内存泄漏会导致响应越来越慢最终卡死。2如何避免内存泄漏工程前期良好的设计规范养成良好的编码规范申请的内存空间记着匹配的去释放.采用RAII思想或者智能指针来管理资源。使用内存泄漏工具检测。如果你年满18周岁以上又觉得学【C语言】太难想尝试其他编程语言那么我推荐你学Python现有价值499元Python零基础课程限时免费领取限10个名额▲扫描二维码-免费领取戳“阅读原文”我们一起进步
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/86752.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!