首页 > 编程语言 >C++ delete语句

C++ delete语句

时间:2023-03-16 14:36:32浏览次数:51  
标签:语句 malloc 存储 C++ 内存 new delete 指针

C++中的五种内存

在C++中内存分为五个区:堆、栈、自由存储区、全局/静态存储区和常量存储区。

堆区:用户使用new获得的内存在这里。用户需要自行管理其声明周期,也就是说一个new要对应一个delete,如果因为某些原因(之后我会说明一些可能的原因)内存没有被释放,那么在程序结束后,会由操作系统自行回收,这显然不是我们想看到的。

栈区:存储局部变量、函数参数等,比方说你在某个函数里定义了一个int变量a,这个a就存放在栈区。这块内存的生命周期由系统管理,不需要我们去操心。

自由存储区:用malloc分配的内存放置在这里。这块内存和堆很相似,不过是使用free来释放内存的。

全局/静态存储区:存放全局变量和静态变量。

常量存储区:存放常量,不允许更改。

new和delete

void testDelete(){
    int *p = new int;
    cout << *p << endl;
    cout << &p << endl;
    *p=1;
    cout << *p << endl;
    cout << &p << endl;
    delete p;
    cout << *p << endl;
    cout << &p << endl;
    p = nullptr; //程序到此停止执行
    cout << *p << endl;
    cout << &p << endl;
}

 

 

可以看出 delete指针并非将该指针弃置不用,而是将其指向的内存中的数据清除,但是指针仍然指向原来的内存!

如果我们想按照delete的英文本意,把这个指针从世界上彻底销毁,需要将指针的值赋为nullptr

智能指针

如果可以,我们应该使用STL提供的shared_ptr和unique_ptr替换原始指针,这样我们可以不用自行管理内存的生命周期,获得类似JAVA和C#的自动内存回收体验。

shared_ptr<int> p = make_shared<int>(1);
shared_ptr<int> q(new int(2));
注意:

不要使用相同的内置指针初始化(或reset)多个智能指针。
不delete get()返回的指针
不适用get()初始化或reset另一个智能指针
如果使用了get()返回的指针,记住当最后一个对应的智能指针销毁后,你的指针就变为无效了。

不过你使用智能指针管理的资源不是new分配的内存,记住传递给它一个删除器。

allocator类

该类帮助我们将内存分配和对象构造分离开来,它分配的内存是原始的、未构造的。

allocator<string> alloc;//可以分配string的allocator对象
auto const p = alloc.allocate(n);//分配n个未初始化的string

malloc/free

从C程序员转换过来的C++程序员总是有个困惑:new/delete到底究竟和C语言里面的malloc/free比起来有什么优势?或者是一样的?

malloc/free只是对内存进行分配和释放;new/delete还负责完成了创建和销毁对象的任务。
new的安全性要高一些,因为他返回的就是一个所创建的对象的指针,对于malloc来说返回的则是void*,还要进行强制类型转换,显然这是一个危险的漏洞。
我们可以对new/delete重载,使内存分配按照我们的意愿进行,这样更具有灵活性,malloc则不行。
不过,new/delete也并不是十分完美,大概最大的缺点就是效率低(针对的是缺省的分配器),原因不只是因为在自由存储区上分配(和栈上对比),而且new只是对于堆分配器(malloc/realloc/free)的一个浅层包装,没有针对小型的内存分配做优化。另外缺省分配器具有通用性,它管理的是一块内存池,这样的管理往往需要消耗一些额外空间。我们可以针对new/delete进行重写以追求更高的效率,对于这方面更深入的探讨可以参考《Effective C++》第八章。

    static void* operator new(size_t sz);
    static void operator delete(void* p);

new 对象实际上做了2件事:调用opeator new,在自由存储区分配一个sizeof(A)大小的内存空间;然后调用构造函数A(),在这块内存空间上类砖砌瓦,建造起我们的对象。

同样对于delete,则做了相反的两件事:调用析构函数~A(),销毁对象,调用operator delete,释放内存。

标签:语句,malloc,存储,C++,内存,new,delete,指针
From: https://www.cnblogs.com/wanglongjiang/p/17222423.html

相关文章

  • C++ 异常
    C++异常exception《C++Primer中文版第五版》Ch5.61.try语句块和异常处理典型的异常失去数据库连接遇到意外输入如果程序的问题是输入无效,则异常处理部......
  • C++信号量实现线程间同步,windows使用SetEvent,linux使用sem_t,QT测试
     目录windows使用CreateEvent、SetEvent、ResetEvent、WaitForSingleObjectlinux使用sem_init、sem_wait、sem_trywait、sem_post、sem_destroy windows使用C......
  • c++ 创建对象
    1.定义类一般写在.h文件中#include<string>#include<iostream>usingnamespacestd;voidprint(charcontent[]);voidTestString1();voidTestString2();voidTe......
  • C++ string类
    小引C语言中,字符串是以\0结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP(面向对象)的思想,而且底层空间......
  • oracle语句单据查询很快,使用union all 后很慢处理
    2023年3月16日10:19:39 某客户现场,开发人员添加了一汇总报表,使用unionall进行了语句链接,单独执行语句均没有问题,但是使用unionall后执行速度特别慢语句类似select......
  • MySQL中IF语句的使用
    mysql中if语句的使用参考地址:https://www.php.cn/mysql-tutorials-417851.html1IF表达式IF(expr1,expr2,expr3)如果expr1是true,则返回expr2,否则返回expr3select*,if......
  • Python 中 with 语句的详解
    1.概述在Python中,只要一个对象实现了__enter__和__exit__方法,那么就能使用with语句,该对象也可以称之为上下文管理器。官方文档的相关说明:上下文管理器的语法:......
  • 站不住就准备加仓,这个pandas语句该咋写?
    大家好,我是皮皮。一、前言前几天在Python白银交流群【还有多远】问了一个Pandas处理的问题,这里拿出来给大家分享下。看上去不太好理解,这里继续给个样式。只有一个条......
  • [牛客BM70&LeetCode322]零钱兑换Ⅰ——DFS,记忆化搜索,动态规划(C++)
    题目描述给你一个整数数组arr,表示不同面额的硬币;以及一个整数aim,表示需要放入钱包的目标金额。计算并返回可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组......
  • 斯坦福 UE4 C++ ActionRoguelike游戏实例教程 05.认识GameMode&自动生成AI角色
    斯坦福课程UE4C++ActionRoguelike游戏实例教程0.绪论概述本篇文章将会讲述UE中Gamemode的基本概念,并在C++中开发GameMode,为游戏设置一个简单的玩法:使用环境查询自动......