C / C++中程序内存区域划分
1.内核空间(用户代码 不能读写)
2.栈 (非静态局部变量/函数参数/返回值等等) 向下增长
3.内存映射段(文件映射 动态库 匿名映射)
4.堆 (用于程序运行时动态内存分配) 向上增长
5.数据段 ----储存全局数据和静态数据
5.代码段 ----可执行的代码 / 只读常量
C语言中动态内存管理方式
malloc / calloc / realloc / free
void Text()
{
int* p1 = (int*)malloc(sizeof(int));
free(p1);
int* p2 = (int*)calloc(1, sizeof(int));
int* p3 = (int*)realloc(p2, sizeof(int) * 1);
//p3 将 p2 的内存大小改变了 ,并且两个指向一个地址
}
C++内存管理方式
通过 new 和 delete 操作符进行动态内存管理
void Text()
{
//动态申请一个int类型的空间
int* p1 = new int;
//动态申请一个int类型的空间并初始化为10
int* p2 = new int(10);
//动态申请10个int类型的空间
int* p3 = new int[10];
delete p1;
delete p2;
delete[] p3;
}
在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数
malloc / free和 new / delete的区别
1.malloc / free是函数,new / delete是操作符
2.malloc申请空间不会初始化,new可以初始化
3. malloc申请空间时,需要手动计算空间大小并传递,new只用在后面跟上空间类型
4.malloc 返回值为void*,在使用时必须强转, new不需要
5.malloc 申请空间失败时,返回的是NULL,因此使用时必须判空,new不需要,new需要异常捕获
6.申请自定义类型对象时,malloc / free只会开辟空间 , 不会调用构造函数和析构函数 . new会调用构造函数,delete会调用析构函数
设计一个类,只能在堆上创建对象
要控制所有的从栈上创建的可能
- 拷贝构造 / 赋值构造禁止 构造函数私有化
- 要调用new
class HeapOnly
{
public:
static HeapOnly* Creat()
{
return new HeapOnly;
}
private:
HeapOnly()
{}
//只声明 不实现
HeapOnly(const HeapOnly&);
bool operator=(const HeapOnly& d);
};
设计一个类,只能在栈上创建对象
只要将 new屏蔽掉就好了
class StackOnly
{
public:
StackOnly()
{}
private:
void* operator new(size_t size);
//个人觉得不需要对delete进行重载,因为没有new
}