C语言的内存分配
malloc
int x;
cin>>x;
int *ptr=(int*) malloc(x* sizeof(int));
p[0]=5; p[1]=1;
malloc返回的是void类型的指针,所以要强制转换
如果分配失败,malloc会返回0
知识扩展*:C++采用nullptr来代替0,但是nullptr在C语言中不能用
calloc
int *ptr=(int* )calloc(x, sizeof(int) )
calloc分配的内存时自动将分配的内存里的值都清0,而mallloc不会
分配失败,返回0
realloc
重新分配内存
int *ptr1=(int* )realloc(ptr,500);
ptr是之前的内存地址,500是重新分配后的内存大小
重新分配有两种情况
假设将100内存重新分配到1000
1.在原有内存基础上扩充,此时返回的内存地址不变,原有数据保留
100 | 900 |
2.如果在原来的基础上不能扩充了,比如剩下的内存只有800,还有100被别的程序占用了,但是要扩充900,所有就要另起一行
100 数据A | 800 |
100 数据A | 900 |
将原来的100(数据A)复制到另外的内存区域,此时返回的内存地址改变,原有数据保留
如果内存分配失败,返回0
释放内存free
语法:
free(ptr);
特别注意*:释放后的内存不能再使用,此时ptr的值并没有变化,但是它成了悬挂指针,释放后的内存如果使用的话,可能会报错,也可能不报错。释放后的内存不能再次释放
C++的内存分配
new
底层还是用的C语言内存分配
int *ptr=new int;
int *ptr1=new int[5]
分配5个int大小的内存
释放内存
delete ptr;
delete[] ptr;
特别注意*:C释放内存用free,C++用delete,不能混用
new、malloc、free、delet、delete[]的本质区别
对于普通的数据类型来说,并没有什么区别,但是对于类来说,当创建类的对象时,malloc仅仅是分配内存,但是new除了分配内存,还会调用构造函数
对于普通的数据类型来说,并没有什么区别,但是对于类来说,当释放类的对象时,free仅仅是释放内存,但是delete除了释放内存,还会调用析构函数
对于普通的数据类型来说,并没有什么区别,但是对于类来说,当释放类的对象时,delete释放内存,还会调用第一个元素的析构函数,但是delete[]除了释放内存,还会调用所有i元素的析构函数
class Role
{
public:
int m_count{};
static inline int count{};
Role()
{
std:: cout<< "第" << ++count << "个构造函数被调用" << std::endl;
m_count = count;
}
~Role()
{
std::cout << "第" << m_count-- << "个析构被调用" << std::endl;
}
};
思考:这里为什么要用m_count--呢
因为,如果这个是对象数组的话,那么析构函数从最后一个对象开始析构的