【c++语法基础】c/c++内存管理

c/c++内存管理

  • 栈区:常量数组

  • 堆区:malloc new等在堆区开辟空间,同时由栈区存储的指针指向他

  • 数据段(静态区):全局变量 + 静态变量

  • 代码段(常量区):常量**

cpp 复制代码
char char2[] = "abcd"
//这里char2作为一个临时数组,在栈上开辟空间,并且存储"abcd",char2作为首元素地址存储在栈上
const char* pchar3 = "abcd"
//区别于上面在堆上开辟空间存入"abcd",这里"abcd"是常量字符串,这里如果并不假如const存在权限的放大,因为常量具有常性

new 和 delete

cpp 复制代码
除了用法上和c的malloc没有什么区别

//c++中引入的关键字new和delete用于动态内存管理

//type\* ps = new type\[个数];

//delete\[]ps
int* ps = new int(10);
int* ps2 = new int[10]{1,2,3};
类型指针 指针名 = new 类型[个数]初始化

c++为什么要引入new和delete,因为如果malloc一个类,malloc并不会调用自定义类型的构造函数,因此c+ +中引入了new 和delete调用构造函数和析构函数,作者就是被坑过的

operator new 和 operator delete

他们不是new和delete的重载,他是底层写好的一种全局函数,operator new的底层是malloc,oprator delete的底层是free

所以我们可以理解为他们是malloc和free的封装

对c++的底层而言 new = operator new( malloc 的封装) + 构造函数

为什么这里用operator new 不用 malloc ,因为operator new在malloc的基础之上有抛异常,他会检验开辟空间的成功性

总结:operator new就是new的局部实现

cpp 复制代码
**注意这里malloc free 和 new delete尽量配套使用,这样可以避免出现不必要的问题**
//显示调用构造函数和析构函数
int main()
{
    A* p = (A*)operator new(sizeof(A));
    new(p)A;
    p->~A();

    operator delete(p);
}

定位new

cpp 复制代码
A* p = (A*)operator new(sizeof(A));
new(p)A;//针对p对应的空间直接创建A,类似于在这里调用构造函数

malloc/free和new/delete的区别

1.malloc和delete是函数,new和delete是操作符

2.new 和 delete是会调用构造函数和析构函数

3.new 相对于 malloc不会需要显示的转化为对应的指针类型

总结

c和c++在开辟空间的时候还是会有一些区别,毕竟C语言是面相过程,C++是面相对象,而且C++基于C语言引入了类的概念。很多初学者认为malloc和new没有什么区别,但是还是存在着一些明显的差异。

相关推荐
励志要当大牛的小白菜1 小时前
ART配对软件使用
开发语言·c++·qt·算法
武子康2 小时前
Java-80 深入浅出 RPC Dubbo 动态服务降级:从雪崩防护到配置中心秒级生效
java·分布式·后端·spring·微服务·rpc·dubbo
PAK向日葵2 小时前
【算法导论】如何攻克一道Hard难度的LeetCode题?以「寻找两个正序数组的中位数」为例
c++·算法·面试
爱装代码的小瓶子4 小时前
数据结构之队列(C语言)
c语言·开发语言·数据结构
YuTaoShao4 小时前
【LeetCode 热题 100】131. 分割回文串——回溯
java·算法·leetcode·深度优先
源码_V_saaskw5 小时前
JAVA图文短视频交友+自营商城系统源码支持小程序+Android+IOS+H5
java·微信小程序·小程序·uni-app·音视频·交友
超浪的晨5 小时前
Java UDP 通信详解:从基础到实战,彻底掌握无连接网络编程
java·开发语言·后端·学习·个人开发
快乐飒男5 小时前
哈希表(c语言)
c语言·哈希算法·散列表
双力臂4046 小时前
Spring Boot 单元测试进阶:JUnit5 + Mock测试与切片测试实战及覆盖率报告生成
java·spring boot·后端·单元测试
Edingbrugh.南空6 小时前
Aerospike与Redis深度对比:从架构到性能的全方位解析
java·开发语言·spring