首页 > 系统相关 >c++动态内存管理干货

c++动态内存管理干货

时间:2024-05-28 11:57:50浏览次数:20  
标签:初始化 c++ 干货 动态内存 operator new delete 构造函数

 c++兼容c所以之前C语言使用的方式在c++中同样可以使用,但c++给出了更加简便的动态内存管理方法.

1.申请内置类型空间

c++定义了新的关键字newdelete(都是操作符不是函数),使用方法如图:

需要注意的是,用new申请空间默认不会初始化,但是可以初始化。如图:

另外,【】里面可以是变量:

2.申请自定义类型空间

事实上,new严格来说是为了解决自定义类型空间的申请

看下图:

像C语言一样用malloc为多个自定义类型申请空间,但是这样会导致一个大问题:我们都知道,类只在创建对象时调用构造函数从而初始化,但是malloc申请时各个对象并不会调用函数处理数据,只是开辟空间而已,导致这10个对象都没有初始化。(成员变量一般得是私有,所以不用想着访问它们的时候赋值)

使用new申请类空间时会调用构造函数初始化对象,在释放空间时也会调用析构函数清除数据,使用如图:

如果需要调用带参构造函数:

如果参数超过一个:

3.扩容

c++没有扩容函数,需要手动扩容:重新开辟一个更大的空间然后把原先的数据拷贝过来。

4.operator new和operator delete

new在底层调用operator new 和 构造函数

delete在底层调用operator delete 和 析构函数

operator new 实际上就是封装的malloc,operator delete实际上是封装的free。

那为什么不直接用malloc呢,因为operator new把错误检查也包含进去了,省事一点,而operator delete则是为了与operator new配对。

5.定位new

对象被创建后也可以用new显式的调用构造函数。每次只能初始化一个

用法:new(对象地址)对象类型(传参)

上图调用构造函数并传入参数去初始化p指向的对象。

如果想初始化多个对象可以使用循环:

如果想一次性初始化多个也不是不可以:

只是相对于循环来说不好控制。

还有一种用法:

new (place_address) type(initializer-list) place_address 必须是一个指针, initializer-list 是类型的初始化列表

标签:初始化,c++,干货,动态内存,operator,new,delete,构造函数
From: https://blog.csdn.net/2302_80221042/article/details/138836392

相关文章

  • C++ - TCP粘包解决方法
     下面的代码演示了粘包问题,客户端连续三次向服务器端发送数据,服务器端却一次性接收到所有数据。服务器代码#define_WINSOCK_DEPRECATED_NO_WARNINGS#include<iostream>usingnamespacestd;//#include<stdio.h>#include<WinSock2.h>​//#pragmacomment(lib,"ws2_......
  • C++中的异类:“#” 符号背后的故事
    最近在写编程语言的书,聊到C++的宏,感觉很有意思,搬运过来。在C++语言中,# 符号是一个独特的符号。它似乎不在语言核心中,但是在源码里却又无处不在。在语法上,#的语法规则在C++体系里独具一格,和C++语法相比像是两个语言似的。这些差别让我们感受到#背后的故事不简单。今天,我们......
  • c++函数指针
     c/c++函数指针的用法【目录】基本定义c函数指针使用举例c++函数指针使用举例函数指针作为函数参数函数指针作为函数返回值函数指针数组typedef简化函数指针操作 c语言函数指针的定义形式:返回类型 (*函数指针名称)(参数类型,参数类型,参数类型,…);c++函数指针......
  • lambda表达式的用例 c++
    出自:  https://blog.csdn.net/qq_45604814/article/details/132687858一、Lambda表达式概述1.介绍Lambda表达式是C++11标准引入的一种特性,它提供了一种方便的方式来定义匿名函数。Lambda表达式是一种能够捕捉外部变量并使用它们的函数对象。由捕获列表、参数列表、返......
  • 打开编程世界 跟着Mr.狠人一起学C/C++
    打开编程世界跟着Mr.狠人一起学C/C++自我介绍大家好,我是Mr.狠人。我高中就读于墨尔本,学习的方向是会计,因为疫情我回到国内读大学,大学的专业是国贸,可以说我没有任何的计算机基础。但我在海外研究生阶段毅然决然的选择了计算机专业,我本可以选择金融专业,或是更简单的管理专业......
  • C++ ─── string的模拟实现
            本博客将简单实现来模拟实现string类,最主要是实现string类的构造、拷贝构造、赋值运算符重载以及析构函数。    下期我们继续讲解完整版string的模拟实现(将不再会是浅拷贝了)        说明:下述string类没有显式定义其拷贝构造函数与赋值运......
  • A Simple Problem with Integers(C++)
     【题目描述】这是一道模板题。给定数列 a[1],a[2],…,a[n] ,你需要依次进行q 个操作,操作有两类:C、lrx :给定 l,r,x ,对于所有 i∈[l,r] ,将 a[i] 加上 x (换言之,将 a[l],a[l+1],…,a[r] 分别加上 x );Q、lr :给定l,r ,求 ∑ri=la[i] 的值(换言之,求 a[l]+a[l+......
  • c++设计模式-装饰器模式和代理模式
    namespace_nmsp1{//抽象的控件类classControl{public:virtualvoiddraw()=0;//draw方法,用于将自身绘制到屏幕上。public:virtual~Control(){}//做父类时析构函数应该为虚函数};//列表控件类classListCtrl......
  • 【C++】旋转字符串——精准与否,就是屠宰和手术的区别
    ✨题目链接:NC114旋转字符串✨题目描述 字符串旋转:给定两字符串A和B,如果能将A从中间某个位置分割为左右两部分字符串(可以为空串),并将左边的字符串移动到右边字符串后面组成新的字符串可以变为字符串B时返回true。例如:如果A=‘youzan’,B=‘zanyou’,A按‘you’‘zan’......
  • C++系列-operator new和operator delete函数
    ......