C++内存管理详解使用方式

 更新时间:2022年04月24日 15:46:38   作者:一起慢慢变强  
内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能更大的自由,C++菜鸟的收获则是一遍—遍的检查代码和对C++的痛恨,但内存管理在C++中无处不在,内存泄漏几乎在每个C++程序中都会发生,要想成为C++高手,内存管理这关是必须过的

c++中内存管理的方式

在c语言中,我们拥有malloc和free等函数可以对内存进行动态管理

但是总体来说不是很方便,所以c++拥有了一种新的方式来对内存进行管理:通过new和delete操作符来对内存进行动态分配

new和delete操作符的使用方式

new操作符的使用方式:

#include<iostream>
using namespace std;
class A
{};
 
int main()
{
	int* p = new int(2);	//动态分配一个int类型的空间,还可以将它初始化
	int* p1 = new int[10];	//动态分配一个数组
	A* p2 = new A;	//动态分配一个类
	return 0;
}

delete操作符的使用方式:

#include<iostream>
using namespace std;
class A
{};
int main()
{
	int* p = new int(2);
	int* p1 = new int[10];	
	A* p2 = new A;	
	delete p;	//销毁p
	delete[] p1;	//销毁p1
	delete p2;	//销毁p2
	return 0;
}

注意:

1、对于自定义类型,new和delete会自动调用构造函数和析构函数对创建出的对象进行初始化,也可以显示的写出想要被初始化的值,而malloc和free不会

#include<iostream>
using namespace std;
class A
{
public:
	A(int x = 1) :_x(x) {}
private:
	int _x;
};
int main()
{
	A* p = new A(2);	//()括号内为显示的给对象初始化的值
	return 0;
}

2、假如要销毁数组类的内容,最好使用[]来修饰一下,因为虽然对于内置类型不会报错,但是自定义类型会直接报错

operator new和operator delete函数

new和delete是用户进行动态内存申请和释放的操作符

operator new 和operator delete是系统提供的全局函数

new在底层调用operator new全局函数来申请空间

delete在底层通过operator delete全局函数来释放空间

最终还是通过malloc和free来进行动态内存分配,不过和c不同的是,c++空间申请失败,会出现抛异常的情况,而不是返回NULL

new和delete的原理内部实现

内置类型

如果申请的是内置类型的空间,new和malloc,delete和free基本类似,不同的地方是:new/delete申请和释放的是单个元素的空间,new[]和delete[]申请的是连续空间,而且new在申请空间失败时会抛异常,malloc会返回NULL

自定义类型

如果是自定义类型,就有很大区别了

new的原理

1、调用operator new申请空间,

2、调用构造自定义类型的构造函数进行初始化

delete的原理

1、调用operator delete释放空间

2、调用自定义类型的析构函数进行初始化

所以我们使用c++的时候最好使用new和delete进行动态内存开辟,因为这样可以更方便进动态内存管理,防止内存泄露

到此这篇关于C++内存管理详解使用方式的文章就介绍到这了,更多相关C++内存管理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 循环队列详解及队列的顺序表示和实现

    循环队列详解及队列的顺序表示和实现

    这篇文章主要介绍了循环队列详解及队列的顺序表示和实现的相关资料,需要的朋友可以参考下
    2016-12-12
  • OpenCV实现车牌字符分割(C++)

    OpenCV实现车牌字符分割(C++)

    这篇文章主要为大家详细介绍了OpenCV实现车牌字符分割,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • 如何利用C++实现mysql数据库的连接池详解

    如何利用C++实现mysql数据库的连接池详解

    为了提高MySQL数据库的访问的瓶颈,除了在服务器端增设缓存服务器缓存常用的数据之外(如redis),还可以增加数据库连接池,来提高MySQL Server的访问效率,这篇文章主要给大家介绍了关于如何利用C++实现mysql数据库的连接池的相关资料,需要的朋友可以参考下
    2021-07-07
  • 解析C++中多层派生时的构造函数及一些特殊形式

    解析C++中多层派生时的构造函数及一些特殊形式

    这篇文章主要介绍了解析C++中多层派生时的构造函数及一些特殊形式,特殊形式主要针对基类和子对象类型的构造函数内容,需要的朋友可以参考下
    2015-09-09
  • C++中register关键字举例详解

    C++中register关键字举例详解

    register用来声明变量,然后声明出来的变量是直接放在cpu的寄存器当中,而非就是通过内存寻址访问,这样效率更高,下面这篇文章主要给大家介绍了关于C++中register关键字的相关资料,需要的朋友可以参考下
    2023-03-03
  • C++如何计算二进制数中1的个数

    C++如何计算二进制数中1的个数

    这篇文章主要介绍了C++如何计算二进制数中1的个数,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • 增加Vscode引用路径的解决方法(2种)

    增加Vscode引用路径的解决方法(2种)

    在嵌入式开发中需要经常用到库函数, Vscode需要配置引用路径,本文主要介绍了增加Vscode引用路径的解决方法,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • C++ 之 Asio 库(全面解析)

    C++ 之 Asio 库(全面解析)

    下面小编就为大家带来一篇C++ 之 Asio 库(全面解析)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • 关于C++中构造函数初始化成员列表的总结

    关于C++中构造函数初始化成员列表的总结

    下面小编就为大家带来一篇关于C++中构造函数初始化成员列表的总结。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • C++中BitSet和Bloom_Filter的实现

    C++中BitSet和Bloom_Filter的实现

    本文主要介绍了C++中BitSet和Bloom_Filter的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-02-02

最新评论