动态内存分配

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.在原有内存基础上扩充,此时返回的内存地址不变,原有数据保留

100900

2.如果在原来的基础上不能扩充了,比如剩下的内存只有800,还有100被别的程序占用了,但是要扩充900,所有就要另起一行

100 数据A800
100  数据A900

将原来的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--呢

因为,如果这个是对象数组的话,那么析构函数从最后一个对象开始析构的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值