网站相对路径和绝对路径,十大中国网站制作,如何做网站卖商品的网站,系统流小说文章目录 1.C/C内存分布2.C语言中动态内存管理#xff1a;malloc/realloc/calloc3.C内存管理方式3.1 new/delete操作内置类型3.2 new和delete操作自定义类型 4.malloc/free和new/delete到底什么区别#xff1f;4.1 对于自定义类型4.2 对于自定义类型4.3 总结#xff1a;它们… 文章目录 1.C/C内存分布2.C语言中动态内存管理malloc/realloc/calloc3.C内存管理方式3.1 new/delete操作内置类型3.2 new和delete操作自定义类型 4.malloc/free和new/delete到底什么区别4.1 对于自定义类型4.2 对于自定义类型4.3 总结它们的区别 5.补充5.1 难道new[]必须和delete[]搭配使用吗5.2 operator new与operator delete函数5.3 new和delete的实现原理5.3.1 内置类型5.3.2 自定义类型 5.4 定位new表达式(placement-new) 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);
}Q1选择题 选项: A.栈 B.堆 C.数据段(静态区) D.代码段(常量区) globalVar在哪里C staticGlobalVar在哪里C staticVar在哪里C localVar在哪里A num1 在哪里A
Q2 char2在哪里A *char2在哪里A pChar3在哪里A *pChar3在哪里D ptr1在哪里A *ptr1在哪里B
对于Q1比较简单Q2少有难度我们先看如下解释
栈又叫堆栈–非静态局部变量/函数参数/返回值等等栈是向下增长的。. 内存映射段是高效的I/O映射方式用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存做进程间通信。Linux知识点堆用于程序运行时动态内存分配堆是可以上增长的。数据段–存储全局数据和静态数据。代码段–可执行的代码/只读常量。 来分析一下Q2对于char2它是一个普通字符串不是常量字符串本人当时搞混了abcd应该是存放在栈当中的char2应该是首元素字符a的地址所以char2是被存放到栈当中的其中内容应该是字符a的地址所以说char2是在栈当中的。对于 *char2 它是对地址的解引用也是在栈当中。
注意对于pchar3const char* pChar3 abcd;const修饰的是 * pchar3不是char3说明pchar3指向的内容是不允许修改的并不是指针pchar3不可以改变指向。
其他就都很简单啦。
2.C语言中动态内存管理malloc/realloc/calloc
void Test ()
{
// 1.malloc/calloc/realloc的区别是什么
int* p2 (int*)calloc(4, sizeof (int));
int* p3 (int*)realloc(p2, sizeof(int)*10);
// 2.这里不需要free(p2)
free(p3 );
}可以详细看这篇博客C语言动态内存开辟
3.C内存管理方式
C语言内存管理方式在C中可以继续使用但有些地方就无能为力而且使用起来比较麻烦因此C又提出了自己的内存管理方式通过new和delete操作符进行动态内存管理。
3.1 new/delete操作内置类型
示例
void Test()
{
// 动态申请一个int类型的空间
int* ptr4 new int;
// 动态申请一个int类型的空间并初始化为10
int* ptr5 new int(10);
// 动态申请10个int类型的空间也可以初始化
int* ptr6 new int[3]{1, 2, 3};
delete ptr4;
delete ptr5;
delete[] ptr6;
}注意申请和释放单个元素的空间使用new和delete操作符申请和释放连续的空间使用new[]和delete[]注意匹配起来使用。
3.2 new和delete操作自定义类型
class A
{
public:A(int a 1):_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不会。
4.malloc/free和new/delete到底什么区别
4.1 对于自定义类型
对于自定义类型malloc和new本质上是没有任何区别的只不过在开创内存失败的时候malloc需要我们手动来写个判断条件看开辟的内存是否成功而new会给我们抛一个异常我们来解释一下抛异常概念
double Divide(int a, int b)
{// 当b 0时抛出异常if (b 0){string s(Divide by zero condition!);throw s;}else{return ((double)a / (double)b);}return 0;
}int main()
{try{int len, time;cin len time;cout Divide(len, time) endl;}catch (const string s){cout s endl;}return 0;
}虽然堆区是很大的但是当我们开辟的空间太大时也可能会报错我们来看malloc和new的区别
new方式这里电脑太卡了截图没有保存到
void func()
{int i 1;while (1){int* p1 new int[1024 * 1024 * 1024];//每次开辟1GBcout i - p1 endl;i;}
}int main()
{try{func();}catch (const std::exception e){cout e.what() endl;}return 0;
}我的电脑大概跑了12次也就是堆区大概有12G的空间之后会报bad alloction。可惜的是截图没有截到不能在跑了太卡了。
对于malloc方式我们必须手动写判断语句不然程序直接崩溃。
4.2 对于自定义类型
class A
{
public:A(int a1 0, int a2 0) //构造函数:_a1(a1),_a2(a2){cout A() this endl;}~A() //析构函数{cout ~A() this endl;}
private:int _a1;int _a2;
};int main()
{A* p1 (A*)malloc(sizeof(A));A* p2 new A(1, 1);free(p1);delete(p2);//A* p5 (A*)malloc(sizeof(A) * 10); //第一种初始化方式//A a1(1), a2(2), a3(3);//A* p6 new A[3]{a1, a2, a3};//A a1 { 1,1 };//第二种初始化方式注意必须要用花括号括起来//A* p6 new A[10]{ {1,1}, {2,2}, {3,3} };//A* p6 new A[10];//free(p5);//delete[] p6;return 0;
}4.3 总结它们的区别
malloc/free和new/delete的共同点是都是从堆上申请空间并且需要用户手动释放。不同的地方是
malloc和free是函数new和delete是操作符malloc申请的空间不会初始化new可以初始化malloc申请空间时需要手动计算空间大小并传递new只需在其后跟上空间的类型即可如果是多个对象[]中指定对象个数即可malloc的返回值为void*, 在使用时必须强转new不需要因为new后跟的是空间的类型malloc申请空间失败时返回的是NULL因此使用时必须判空new不需要但是new需要捕获异常申请自定义类型对象时malloc/free只会开辟空间不会调用构造函数与析构函数而new在申请空间后会调用构造函数完成对象的初始化delete在释放空间前会调用析构函数完成空间中资源的清理释放
5.补充
5.1 难道new[]必须和delete[]搭配使用吗 看这张图片我们new了一个数组却是用delete并不是delete[]也没有报错是因为delete本质上其实就是free在以前我们malloc开辟数组的时候也只需要free他的首地址就可以了这里是一样的道理但是我们推荐写delete[]这样浅显易懂知道我们开辟的是数组。 看上面就报错了。
Q我们可以发现一件事情为什么程序在执行完第一个析构函数后就崩溃了呢 A这里就不得不提一下new[]的原理了其实使用new[]系统用会帮助我们再开辟四个字节的地址放在指针p的前面他主要的作用就是记录我们开辟了多少了自定义类型A目的是为了之后析构不然他不知道析构多少次这也就是为什么在第一个析构函数制之后崩溃就是因为程序不知道要析构几次。所以这里就必须要写上delele[]就是记录了开辟多少个自定义类型A。
5.2 operator new与operator delete函数 new和delete是用户进行动态内存申请和释放的操作符operator new 和operator delete是系统提供的全局函数new在底层调用operator new全局函数来申请空间delete在底层通过operator delete全局函数来释放空间。 这里有一段他们底层的代码我们就不看了我们直接记下结论 operator new 实际也是通过malloc来申请空间如果 malloc申请空间成功就直接返回否则执行用户提供的空间不足应对措施如果用户提供该措施就继续申请否则就抛异常。operator delete 最终是通过free来释放空间的。 5.3 new和delete的实现原理
5.3.1 内置类型 如果申请的是内置类型的空间new和mallocdelete和free基本类似不同的地方是 new/delete申请和释放的是单个元素的空间new[]和delete[]申请的是连续空间而且new在申请空间失败时会抛异常malloc会返回NULL。 5.3.2 自定义类型
new原理
调用operator new函数申请空间在申请的空间上执行构造函数完成对象的构造
delete原理
在空间上执行析构函数完成对象中资源的清理工作调用operator delete函数释放对象的空间
new A[N]原理
调用operator new[]函数在operator new[]中实际调用operator new函数完成N个对象空间的申请在申请的空间上执行N次构造函数
delete[]的原理
在释放的对象空间上执行N次析构函数完成N个对象中资源的清理调用operator delete[]释放空间实际在operator delete[]中调用operator delete来释 放空间
5.4 定位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;
};int main()
{A* p1 (A*)malloc(sizeof(A));new(p1)A;// 注意如果A类的构造函数有参数时此处需要传参//p1-A(); // 不支持p1-~A();free(p1);A* p2 (A*)operator new(sizeof(A));new(p2)A(10);p2-~A();operator delete(p2);return 0;
}
文章转载自: http://www.morning.rxwfg.cn.gov.cn.rxwfg.cn http://www.morning.hrtwt.cn.gov.cn.hrtwt.cn http://www.morning.roymf.cn.gov.cn.roymf.cn http://www.morning.drfcj.cn.gov.cn.drfcj.cn http://www.morning.bqmsm.cn.gov.cn.bqmsm.cn http://www.morning.ntdzjx.com.gov.cn.ntdzjx.com http://www.morning.lkmks.cn.gov.cn.lkmks.cn http://www.morning.ryglh.cn.gov.cn.ryglh.cn http://www.morning.jwfqq.cn.gov.cn.jwfqq.cn http://www.morning.rlkgc.cn.gov.cn.rlkgc.cn http://www.morning.xhsxj.cn.gov.cn.xhsxj.cn http://www.morning.ggqcg.cn.gov.cn.ggqcg.cn http://www.morning.kspfq.cn.gov.cn.kspfq.cn http://www.morning.lwhsp.cn.gov.cn.lwhsp.cn http://www.morning.pxdgy.cn.gov.cn.pxdgy.cn http://www.morning.jfmjq.cn.gov.cn.jfmjq.cn http://www.morning.rdlxh.cn.gov.cn.rdlxh.cn http://www.morning.kltmt.cn.gov.cn.kltmt.cn http://www.morning.nfks.cn.gov.cn.nfks.cn http://www.morning.kycxb.cn.gov.cn.kycxb.cn http://www.morning.rwlnk.cn.gov.cn.rwlnk.cn http://www.morning.gmswp.cn.gov.cn.gmswp.cn http://www.morning.wwgpy.cn.gov.cn.wwgpy.cn http://www.morning.yjmlg.cn.gov.cn.yjmlg.cn http://www.morning.wlnr.cn.gov.cn.wlnr.cn http://www.morning.ypjjh.cn.gov.cn.ypjjh.cn http://www.morning.rpwck.cn.gov.cn.rpwck.cn http://www.morning.rxhs.cn.gov.cn.rxhs.cn http://www.morning.kqpxb.cn.gov.cn.kqpxb.cn http://www.morning.epeij.cn.gov.cn.epeij.cn http://www.morning.bchgl.cn.gov.cn.bchgl.cn http://www.morning.plqkz.cn.gov.cn.plqkz.cn http://www.morning.zgztn.cn.gov.cn.zgztn.cn http://www.morning.rnrwq.cn.gov.cn.rnrwq.cn http://www.morning.bzbq.cn.gov.cn.bzbq.cn http://www.morning.fzlk.cn.gov.cn.fzlk.cn http://www.morning.hwtb.cn.gov.cn.hwtb.cn http://www.morning.hnmbq.cn.gov.cn.hnmbq.cn http://www.morning.zmnyj.cn.gov.cn.zmnyj.cn http://www.morning.flqkp.cn.gov.cn.flqkp.cn http://www.morning.xppj.cn.gov.cn.xppj.cn http://www.morning.kyhnl.cn.gov.cn.kyhnl.cn http://www.morning.rgksz.cn.gov.cn.rgksz.cn http://www.morning.51meihou.cn.gov.cn.51meihou.cn http://www.morning.yksf.cn.gov.cn.yksf.cn http://www.morning.clpfd.cn.gov.cn.clpfd.cn http://www.morning.wqfj.cn.gov.cn.wqfj.cn http://www.morning.jpqmq.cn.gov.cn.jpqmq.cn http://www.morning.fsbns.cn.gov.cn.fsbns.cn http://www.morning.ccyns.cn.gov.cn.ccyns.cn http://www.morning.mhxlb.cn.gov.cn.mhxlb.cn http://www.morning.djwpd.cn.gov.cn.djwpd.cn http://www.morning.lkxzb.cn.gov.cn.lkxzb.cn http://www.morning.rynq.cn.gov.cn.rynq.cn http://www.morning.mjyrg.cn.gov.cn.mjyrg.cn http://www.morning.xnnpy.cn.gov.cn.xnnpy.cn http://www.morning.ftlgy.cn.gov.cn.ftlgy.cn http://www.morning.bqdpy.cn.gov.cn.bqdpy.cn http://www.morning.khyqt.cn.gov.cn.khyqt.cn http://www.morning.fndmk.cn.gov.cn.fndmk.cn http://www.morning.sgbsr.cn.gov.cn.sgbsr.cn http://www.morning.cqwb25.cn.gov.cn.cqwb25.cn http://www.morning.mgmyt.cn.gov.cn.mgmyt.cn http://www.morning.rbxsk.cn.gov.cn.rbxsk.cn http://www.morning.horihe.com.gov.cn.horihe.com http://www.morning.hlnrj.cn.gov.cn.hlnrj.cn http://www.morning.smcfk.cn.gov.cn.smcfk.cn http://www.morning.rzrbw.cn.gov.cn.rzrbw.cn http://www.morning.ckbmz.cn.gov.cn.ckbmz.cn http://www.morning.qfwzm.cn.gov.cn.qfwzm.cn http://www.morning.tpwrm.cn.gov.cn.tpwrm.cn http://www.morning.fcwxs.cn.gov.cn.fcwxs.cn http://www.morning.dgwrz.cn.gov.cn.dgwrz.cn http://www.morning.tsnmt.cn.gov.cn.tsnmt.cn http://www.morning.fwdln.cn.gov.cn.fwdln.cn http://www.morning.trqsm.cn.gov.cn.trqsm.cn http://www.morning.pakistantractors.com.gov.cn.pakistantractors.com http://www.morning.lmctj.cn.gov.cn.lmctj.cn http://www.morning.qtzwh.cn.gov.cn.qtzwh.cn http://www.morning.xbyyd.cn.gov.cn.xbyyd.cn