服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C++内存管理详解使用方式

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

2022-11-16 15:44一起慢慢变强 C/C++

内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能更大的自由,C++菜鸟的收获则是一遍—遍的检查代码和对C++的痛恨,但内存管理在C++中无处不在,内存泄漏几乎在每个C++程序中都会发生

c++中内存管理的方式

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

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

new和delete操作符的使用方式

new操作符的使用方式:

?
1
2
3
4
5
6
7
8
9
10
11
12
#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;
}

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

delete操作符的使用方式:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#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;
}

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

注意:

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#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++内存管理内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/qq_45358642/article/details/124201081

延伸 · 阅读

精彩推荐
  • C/C++C++浮点型的存储方式详解

    C++浮点型的存储方式详解

    本篇文章是对C/C++浮点数在内存中的存储方式进行了详细的分析介绍,需要的朋友参考下,希望能够给你带来帮助...

    Emile_南南沐4012022-01-04
  • C/C++简述C++中虚拟函数的内存分配机制

    简述C++中虚拟函数的内存分配机制

    这篇文章主要介绍了简述C++中虚拟函数的内存分配机制,帮助大家更好的理解和学习c++,感兴趣的朋友可以了解下...

    ccf198810308042021-09-23
  • C/C++C++实现LeetCode(138.拷贝带有随机指针的链表)

    C++实现LeetCode(138.拷贝带有随机指针的链表)

    这篇文章主要介绍了C++实现LeetCode(138.拷贝带有随机指针的链表),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以...

    Grandyang8582021-12-06
  • C/C++C++ txt 文件读取,并写入结构体中的操作

    C++ txt 文件读取,并写入结构体中的操作

    这篇文章主要介绍了C++ txt 文件读取,并写入结构体中的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    QT-Neal10202021-10-11
  • C/C++Windows窗口消息实例详解

    Windows窗口消息实例详解

    这篇文章主要介绍了Windows窗口消息,以实例形式详细罗列了Windows窗口消息,非常具有实用价值,需要的朋友可以参考下 ...

    惟愿莲心不染尘9022021-02-26
  • C/C++C语言数据结构中串的模式匹配

    C语言数据结构中串的模式匹配

    这篇文章主要介绍了C语言数据结构中串的模式匹配的相关资料,需要的朋友可以参考下...

    C语言教程网3852021-05-11
  • C/C++C++实现神经网络框架SimpleNN的详细过程

    C++实现神经网络框架SimpleNN的详细过程

    本来自己想到用C++实现神经网络主要是想强化一下编码能力并入门深度学习,对C++实现神经网络框架SimpleNN的详细过程感兴趣的朋友一起看看吧...

    Peiy_Liu3682021-12-22
  • C/C++VS2019+Opencv4.0+Win10配置详解

    VS2019+Opencv4.0+Win10配置详解

    这篇文章主要介绍了VS2019+Opencv4.0+Win10配置详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随...

    kiripeng5892021-08-31