C++的内存管理


前言

提示:这里可以添加本文要记录的大概内容:

    C语言中,动态的申请内存使用的是malloc、calloc、realloc三个函数,释放使用的是free函数。C++在此的基础上进行了升级,使用new和delete对内存进行管理。


提示:以下是本篇文章正文内容,下面案例可供参考

一、malloc、calloc、realloc的函数原型以及使用的区别

1、函数原型

malloc:  void *malloc( size_t size );

calloc:   void *calloc( size_t num, size_t size );

realloc: void *realloc( void *memblock, size_t size );

2、使用区别

            malloc的参数是要开辟的大小,calloc的第一个参数是开辟的个数,第二个参数是开辟的大小,而当我们要更改开辟的动态内存大小的时候,使用的是realloc,该函数的第一个形参是更改内存的地址,第二个形参是更改后的大小。三个函数申请失败时返回值为NULL,所以在使用之后需要判断返回值。

二、new和delete

1、申请和释放单个元素的空间,使用new和delete操作符,申请和释放连续的空间,使用new[]和

delete[]。


int main()
{
	Test* p1 = new Test(9);
	Test* p2 = new Test[10];

	delete p1;
	delete[] p2;
	return 0;
}

2、new和delete的优点

2.1、使用简单,malloc只申请空间,free只释放空间,并不能调用构造和析构函数。而new首先会申请空间,在调用构造函数进行初始化,delete会西安调用析构函数释放指针所指空间,在释放new申请的空间。

2.2  malloc申请空间的时候,需要手动计算空间大小进行传递,new只需要在其后面跟空间的类型。

2.3、malloc的返回值为void*,在使用的时候需要进行强转,new不需要,但是new需要捕捉异常。

3.new和delete 的用法实例

#include<iostream>
using namespace std;

class Test
{
public:
	Test(int data=0)
	{
		cout << "Test::Test" << endl;
	}

	~Test()
	{
		cout << "Test::~Test" << endl;
	}
private:
	int m_data=0;
};

int main()
{
	Test* p1 = new Test(9);
	Test* p2 = new Test[10];
	Test* p3 = new Test;

	delete p1;
	delete[] p2;
	delete p3;
	return 0;
}


三、new/delete operator、operator new/delete、palacement  new 

1、new/delete operator

    所谓的 new 表达式,就是我们做常用的用于分配动态对象的表达式,如下操作就是运用new表达式进行动态对象的分配。

2、operator new/delete

    operator new / delete 负责向系统申请内存,一般由operator new / delete 申请的内存为原始内存,在该内存上并没有特定的对象,因此,对于用该运算符申请得到的内存我们需要手动为其构造对象,并手动的调用对象的析构函数。
operator new / delete 可以重载,通过重载,可以改变向内存申请内存的方式。在c++编译器的内部,实际上operator new / delete是通过调用C语言函数malloc / free 实现堆内存的申请和释放的。

3、palacement  new 

      placement new 用于在一块已经分配了内存上构造某个对象,这就是为什么它会被称为placement new, palcement new 实际上并没有向内存申请内存空间,他仅是负责在一块已经分配的内存上构造对象。上面的代码我们已经获得一块原始内存,因此我们需要在上述的代码中构造相应的对象,因此我们需要先将原始内存强制转换相应的类型,然后通过placement new在上面构造对象。
 

总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值