学习
实践
活动
工具
TVP
写文章

C++ 动态内存

c++内存上我碰到很多很多坑~,特此来记一笔。 但是除了自动和static对象之外,C++还支持动态分配对象。比较特殊的是,动态分配的对象的生存期与它在哪里创建是无关的,只有在显示地被释放时,这些动态分配的对象才会被销毁。 动态内存:保存在堆上,除了静态内存和栈内存, 每个程序都有一个内存池,这个内存池被称为自由空间(free store)或者堆(heap). 销毁对象,释放内存。尤其是使用智能指针能够在动态对象不再使用时释放动态对象的特性,使得内存的使用变得非常容易。 基本上shared_ptr和unique_ptr就已经讲解完了,除了采用智能指针管理动态内存,我们还可以直接管理动态内存。 直接管理内存 用new 动态分配和初始化对象 ? ? 释放动态内存 ?

35720

C++ 动态内存

了解动态内存C++ 中是如何工作的是成为一名合格的 C++ 程序员必不可少的。C++ 程序中的内存分为两个部分: 栈:在函数内部声明的所有变量都将占用栈内存。 堆:这是程序中未使用的内存,在程序运行时可用于动态分配内存。 很多时候,您无法提前预知需要多少内存来存储某个定义变量中的特定信息,所需内存的大小需要在运行时才能确定。 在 C++ 中,您可以使用特殊的运算符为给定类型的变量在运行时分配堆内的内存,这会返回所分配的空间地址。这种运算符即 new 运算符。 如果您不再需要动态分配的内存空间,可以使用 delete 运算符,删除之前由 new 运算符分配的内存。 )分配内存,我们可以使用上面实例中的语法来为数组动态地分配内存,如下所示: char* pvalue = NULL;// 初始化为 null 的指针 pvalue =newchar[20];// 为变量请求内存

15610
  • 广告
    关闭

    2022腾讯全球数字生态大会

    11月30-12月1日,邀您一起“数实创新,产业共进”!

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    c++动态内存

    why:正确释放动态申请的内存 how:smart pointer(#include<memory>) shared_ptr   unique_ptr weak_ptr shared_ptr:允许多个指针同时指向同一个对象 ,p所指空间已被释放,可能会出现 double free 和解引用非法内存,但是最好使用make_shared代替shared_ptr(new int() ) (2)管理           shared_ptr 号右边的引用计数器+1,一次声明周期结束时,计数器会-1当shared_ptr引用计数值=0,会自动释放自己所管理的对象shared_ptr保证,只要有任何指针引用对象,对象就不会被释放掉 (3)运用动态分配内存的理由不知道要使用多少对象 :  例如容器不知道所需对象的准确类型:   例如为实现多态而动态申请父类元素指针多个对象共享数据动态分配内存程序员容易造成内存泄露,所以要用智能指针 (4)直接管理内存: int* p = new int ,需要手动释放                              (5)常犯的错误:                忘记delete new申请的动态内存(new[]/delete[]) //

    11720

    C++ 传递动态内存

    这部分内容在引用作为函数的参数这个blog中有一些涉及,为了讨论引用传递顺带了参数传递与指针传递,在这里从动态内存传递的角度梳理一下,先看这样一个题目: 下面五个函数中,哪些函数能够实现值的交换? *a; 定义了指针temp,而在执行*temp = *a;的时候,想要把指针指向的值赋值给temp指向的值,但是temp在定义的时候没有指向任何地址,也就是它是一个空指针,但是我们又硬要给一个不存在的内存赋值 ,此时系统就会给一个随机地址,但是这个随机地址在函数结束的时候不会收回,这就造成了内存泄漏。 而且swap2的代码在vs2010里无法运行,编译没问题但是报异常,既然是由于上面的原因,那么我们就在temp定义的时候初始化它呗,这样temp就有了指向的内存: void swap2(int *a,int

    417100

    C++动态内存管理

    动态内存管理可以使用new关键字,就可以动态地声明变量,返回指向它的指针。 释放内存的时候,要使用delete关键字,就能释放掉这部分内存。 注意,释放数组要使用delete[]关键字。 当一个对象不再使用的时候,应该将它释放掉,否则会导致内存泄漏。 C++11提供了一个unique_ptr,作为一个只能指针,可以方便我们释放内存。 当一个变量不再被使用时,它会自动被释放,防止内存泄漏。 转载请注明:https://www.longjin666.top/?p=872

    5120

    C++ 动态内存《Rice C++ 学习开发》

    堆:在程序运行时可用于动态分配内存。 在C++提供了两个关键字new和delete,进行内存动态申请和释放。 new:在程序运行中奉陪堆内的内存,并返回所分配的空间地址。 用法:new为任意的数据类型分配动态内存,其中:new type。(type:可以内置的数据类型,例如:数组、类)。 malloc(),在C++也拥有malloc()来申请内存。 但是C++中一般不适用malloc,而是使用new。new不只是分配内存,还可以创建对象。 delete:当不在占用动态内存时,通过delete动态释放内存。 cout << "out of memory" << endl; } cout << rice << endl; delete rice; return 0; } 对象的动态内存的分配

    11620

    C++学习——动态内存分配「建议收藏」

    为什么需要动态内存分配 解决方法:动态内存分配 动态申请内存操作符 new new 类型名T(初始化参数列表) 释放内存操作符delete delete 指针名p 注意问题 内存泄露举例 申请和释放动态数组 动态创建多维数组 何为静态内存分配? 解决方法:动态内存分配 C/C++定义了4个内存区间:代码区,全局变量与静态变量区,局部变量区即栈区(stack),动态存储区,(堆heap区或自由存储区free store)。 所有动态存储分配都在堆区中进行。 动态申请内存操作符 new new 类型名T(初始化参数列表) 功能:在程序执行期间,申请用于存放T类型对象的内存空间,并依初值列表赋以初值。 注意问题 初始化问题 标准数据类型: int *point; point=new int(2); C++比C中多了类的概念, 建立对象时,要调用类的构造函数; 删除对象时

    5710

    Linux内存信息查看——free命令

    free 命令可以显示系统已用和空闲的内存情况。包括物理内存、交互区内存(swap)和内核缓冲区内存(buffer)。共享内存将被忽略。 1 用法及常用参数 free [option] -b  # 以Byte为单位显示内存使用情况 -k  # 以KB为单位显示内存使用情况 -m  # 以MB为单位显示内存使用情况 -g # 以GB free:未被分配的内存。 shared:多个进程共享的内存总额。 buffers:系统分配但未被使用的buffers 数量。 cached:系统分配但未被使用的cache 数量。 可用内存=系统free memory+buffers+cached。 因为Linux kernel并没有滴水不漏地统计所有的内存分配,kernel动态分配的内存中就有一部分没有计入/proc/meminfo中。

    1.3K20

    C++:26---动态内存管理new、delete

    对于非内部数据类型的对象而言,光用malloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。 由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。 new和delete是运算符不是函数 因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。 new的动态内存没有被释放(销毁),那么该动态内存就一直存在,会造成浪费 五、delete的使用规则 规则如下 不能用来释放一块静态内存(栈区) 用来释放动态申请的内存(new申请的堆区) 允许释放一个空指针 但是如果是C++对象数组就不同了!我将会在接下来的第28节说到这块

    19220

    C++随记(二)---动态分配内存问题(1)

    C++随记(二)---动态分配内存问题(1) 面向对象的编程的一个特点就是在运行阶段(而不是编译阶段)进行决策。运行阶段决策提供了灵活性,可以根据当时的情况进行调整。 C语言使用库函数malloc()来分配内存C++中可以这么用,但是更为常用的就是用new运算符来分配内存,在了解new运算符时你最好已经知道C++的指针是怎么回事。 类型名* point2 = new 类型名; ···; Delete point2; 2、使用new来创建动态数组 对于大型数据,如数组、字符串、结构体,使用new才能真正体会到动态开辟内存的妙处。 而使用new时,我在程序运行时将视具体情况来决定我是否创建数组,并且可以选择其长度,这样的数字称之为 动态数组,此过程被成为 动态联编。 points[1]就是第二个元素,points[0]就是第一个元素,这是因为C++内部也使用指针来处理数组。详细分析会在下一篇博文介绍。

    28500

    Linux free命令:显示系统内存情况

    Linux free命令用于显示内存状态,显示内存的使用情况,包括物理内存,交换内存,以及系统核心使用的缓冲区等,这些信息是通过解析文件 /proc/meminfo 而得到的。 语法格式:free [参数] 常用参数: -b 以Byte显示内存使用情况 -k 以kb为单位显示内存使用情况 -m 以mb为单位显示内存使用情况 -g 以gb为单位显示内存使用情况 -s 持续显示内存 -t 显示内存使用总合 参考实例 显示内存使用情况: [root@bunian ~]# free total used free : [root@bunian ~]# free -m total used free shared buff/cache available : [root@bunian ~]# free -K total used free shared buff/cache available

    4430

    C++随记(三)---动态分配内存问题(2)

    C++随记(三)---动态分配内存问题(2)      上一篇博文讲到了使用动态数组时,只要把指针名字当作数组名使用即可,而且指针名可以进行运算,而数组名不能进行运算,这篇博文就来简要解释一下。 最通俗的解释:C++将数组名解释为地址。     什么意思呢? 也就是说:C++将数组名解释为数组第1个元素的地址。 这两个地址,从数值上来说是一样的,但是概念不一样,即&array[0]是一个4个字节内存块的地址(因为我上面定义的是int array[10]),而&array是一个 4*10=40个内存块的地址。 解释完上篇博文留下的问题之后,再来看看一个和动态数组类似的应用,用new建立动态结构体。

    30300

    c++复合类型(使用new来分配内存创建动态数组、delete释放内存

    一、使用new来分配内存 以下代码演示了如何将new用于两种不同的类型。 2、指针真正的勇武之地在于,在运行阶段分配未命名的内存以存储内存; 在c语言中,可以用库函数malloc()来分配内存;在c++中仍然可以这样做,但c++还有更好的方法——new运算符。 二、使用delete释放内存 int * ps = new int; . . . delete ps; 1、只能用delete来释放使用new分配的内存。 三、使用new来创建动态数组 #include<iostream> using namespace std; int main() { double* p3 = new double[3]; p3[ 2、使用new[ ]为一个实体分配内存,则应使用delete(没用方括号)来释放。

    11530

    linux下free查看内存命令详细解析

    最近经常因为服务器的内存不足导致网站崩溃,现在采用swap稍微好些,不过为了增强性能,还是来学习一下free内存查看命令的分析方式吧。 ? 系统的总物理内存:992M,但系统当前真正可用的内存b并不是第一行free 标记的 77M,它仅代表未被分配的内存。 我们使用total1、used1、free1、used2、free2 等名称来代表上面统计数据的各值,1、2 分别代表第一行和第二行的数据。 total1:992M表示物理内存总量。 free2:785M未被使用的buffers 与cache 和未被分配的内存之和,这就是系统当前实际可用内存。 原创文章,转载请注明: 转载自URl-team 本文链接地址: linux下free查看内存命令详细解析

    1.4K10

    free -m 内存使用情况解读

    : 1006M used 已经使用的内存数: 959M free 空闲的内存数: 46M shared 当前已经废弃不用,总是 0 buffers Buffer 缓存内存数: 86M cached ) used 内存数:269M (指的第一部分 Mem 行中的 used – buffers – cached) (+buffers/cache) free 内存数: 736M (指的第一部分 Mem 行中的 free + buffers + cached) 所以说-buffers/cache 反映的是被现有程序实实在在吃掉的内存,而+buffers/cache 反映的是你还可以挪用的内存数。 都是属于被使用,所以它认为 free 只有 232。 平时我们说 linux 系统剩余内存多少,一般是说(-/+ buffers/cache)的 free 还有多少,因为这个都是可用的。

    3.4K50

    C++:27---new delete malloc free

    * pointer)//参数代表内存地址 new、delete则为C++的操作运算符,它调用的分别为赋值运算符重载operator new()和operator delete(); 实际上我在上一节已经讲了 ,因为若它可能开辟失败会返回NULL;new则不用判断,因为内存分配失败时,它会抛出异常bac_alloc,可以使用异常机制; (4)无论释放几个空间大小,free只传递指针,多个对象时delete 需加[](原因在第3); 2.内存申请和释放方式 malloc/free为函数只是开辟空间并释放,new/delete则不仅会开辟空间,并调用构造函数和析构函数进行初始化和清理,如下为new/delete new / operator delete,它们可以被重载,在标准库里它有8个重载版本;而malloc/free不可以重载; 6.对于malloc分配内存后,若在使用过程中内存分配不够或太多,这时可以使用 8.最后一点对于new/delete与malloc/free申请内存位置说明,malloc我们知道它是在堆上分配内存的,但new其实不能说是在堆上,C++中,对new申请内存位置有一个抽象概念,它为自由存储区

    27230

    一文读懂C语言与C++动态内存

    C、C++程序编译的内存分配 1.从静态存储区域分配 内存在程序编译时就已经分配好,这块内存在程序的整个运行期间都存在。速度快、不容易出错,因为有系统会善后。例如全局变量,static变量等。 程序在运行的时候用malloc或new申请任意大小的内存,程序员自己负责在何时用free或delete释放内存动态内存的生存期由程序员决定,使用非常灵活。 一个C、C++程序编译时内存分为5大存储区:堆区、栈区、全局区、文字常量区、程序代码区,如下表所示。 ? //申请失败异常处理 } 另外,没有释放动态申请的内存空间。 代码四:同代码三一样,申请了动态内存后没有检验是否申请成功就直接使用,并且在free( str)后str没有置空,str成了“野指针”。 一定要记得每次释放动态申请的内存空间后指针要置空,如下: free(str); str = NULL; 答案 四段代码全有错误: 代码一:A( char *p )的参数为字符型指针,在这个函数修改参数

    16610

    C++并发实战19:lock free编程

    一个lock free的栈: #include <atomic> #include <memory> template<typename T> class lock_free_stack//栈的底层数据结构采用单向链表实现 { private: struct node { std::shared_ptr<T> data;//这里采用shared_ptr管理的好处在于:若栈内存放对象pop中 node(T const& data_): data(std::make_shared<T>(data_))//注意make_shared比直接shared_ptr构造的内存开销小 {} }; std::atomic<node*> head;//采用原子类型管理栈顶元素,主要利用atomic::compare_exchange_weak实现lock free ,故不是wait free }; 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/161734.html原文链接:https://javaforall.cn

    12330

    内存对齐(C++

    内存对齐的概念 引入代码 众所周知,C++的空类占用1个字节的内存空间,非空类占用的空间与类内的成员有关。 但类中成员所占内存并不是连续的,拿以下代码举例: #include<iostream> using namespace std; class test1 { char c1; int a 这是因为成员变量的存储并不是连续的,而是根据一定的块大小存储(一般默认为4),这就是所谓的内存对齐。 内存对齐的规则 对齐系数与有效对齐值 首先明确两个概念 对齐系数:每个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。 (即编译器只会按照1、2、4、8、16的方式分割内存,其他值无效) 图示 test的内存分配如下 如果把使用#pragma pack(n)把默认的对齐系数改为1,代码如下 #include<iostream

    6020

    linux内存使用情况分析(free + top)

    文章转载自:https://www.cnblogs.com/pengdonglin137/p/3315124.html linux下在终端环境下可以使用free命令看到系统实际使用内存的情况,一般用free 而系统实际可用内存是不是free部分呢,不是的,系统实际内存占用以及可用内存有如下几个加减法: used=total-free 即 total=used+free 实际内存占用:used-buffers-cached 即 total-free-buffers-cached 实际可用内存:buffers+cached+free total used free : 128 used 已经使用的内存数: 119 free 空闲的内存数: 8 shared 当前已经废弃不用,总是0 buffers Buffer Cache内存数: 1 cached Page Cache 的内存数: 32 (等于第1行的 free + buffers + cached) 可见-buffers/cache反映的是被程序实实在在吃掉的内存,而+buffers/cache反映的是可以挪用的内存总数

    1.2K40

    扫码关注腾讯云开发者

    领取腾讯云代金券