首页 > 其他分享 >使用new[]后使用delete[]根本原因

使用new[]后使用delete[]根本原因

时间:2024-03-29 15:03:59浏览次数:11  
标签:std cout int 使用 new delete 指针

需要分情况讨论:以下环境为Ubuntu20.04 g++ 9.4.0

  • 当数据是基本数据类型时,由于没有析构函数,所以系统没有必要记录数组大小。所以new[]后的指针就是实际申请内存大小,所以delete与delete[]没有区别,以下代码是不会抛出申请与释放指针不一致异常

    
    #include <iostream>
    int main() {
        int * a = new int[10] ;
        delete a;
        getchar();
        return 0;
    }
    
    
  • 当数据为自定义数据类型时,由于需要挨个调用析构函数,所以在mallco时会多申请一个8位,来存储数组大小,导致new返回的指针并不是原始指针,而是在mallco的指针移动8位后的指针。

    1. delete,到operator delete执行时就是new返回的指针,而不是真实指针。所以释放会抛出申请与释放指针不一致异常

      #include <iostream>
      using namespace std;
      class A
      {
      public:
          A()
          {
          }
          ~A()
          {
              std::cout << "A" << std::endl;
          }
      
          static void operator delete[](void* ptr)
          {
              std::cout << "custom delete for PTR " << ptr << '\n';
              ::operator delete[](ptr);
          }
          static void operator delete(void* ptr, std:: size_t sz )
          {
              std::cout << "custom delete for PTR " << ptr << '\n';
              ::operator delete(ptr);
          }
      };
      
      int main() {
      
          A * a = new A[10] ;
          std::cout << a << std::endl;
          delete a;
          getchar();
          return 0;
      }
      

      0x558f7965aeb8
      A
      custom delete for PTR 0x558f7965aeb8
      munmap_chunk(): invalid pointer
      Aborted (core dumped)

    2. 当**delete[]**时,调用operator delete[]时执行的指针就是new返回的指针移动8位后的指针,正好是mallco出来的指针,这样就不会异常

      #include <iostream>
      using namespace std;
      class A
      {
      public:
          A()
          {
          }
          ~A()
          {
              std::cout << "A" << std::endl;
          }
      
          static void operator delete[](void* ptr)
          {
              std::cout << "custom delete for PTR " << ptr << '\n';
              ::operator delete[](ptr);
          }
          static void operator delete(void* ptr, std:: size_t sz )
          {
              std::cout << "custom delete for PTR " << ptr << '\n';
              ::operator delete(ptr);
          }
      };
      
      int main() {
      
          A * a = new A[10] ;
          std::cout << a << std::endl;
          delete[] a;
          getchar();
          return 0;
      }
      

      0x560989727eb8
      A
      A
      A
      A
      A
      A
      A
      A
      A
      A
      custom delete for PTR 0x560989727eb0

标签:std,cout,int,使用,new,delete,指针
From: https://blog.csdn.net/qq_38227033/article/details/137139017

相关文章

  • 使用easyPoi的动态列导出
    项目背景:有一个导出excel的需求,要求导出部分固定列和部分动态列,固定列使用字段写死,动态列使用list集合存放成果展示:思路:简单说就是一个行转列的处理1.使用easypoi的注解方式进行导出,固定列部分使用@Excel标注2.动态列使用一个List集合,用@ExcelCollection标注,里面的......
  • JAVA学习-网络编程.使用代理服务器
           代理服务器在网络编程中扮演着重要的角色,它可以作为中间层来处理网络请求和响应,提供更高级的功能。Java网络编程提供了多种方式来使用代理服务器,包括使用'Proxy'类和使用'ProxySelector'类。下面是关于使用代理服务器的概述以及与其他比较和高级应用的说明:1.......
  • 如何安装和使用Docker
    本文深入解析Docker,一种革命性的容器化技术,从其基本概念、架构和组件,到安装、配置和基本命令操作。文章探讨了Docker在虚拟化、一致性环境搭建及微服务架构中的关键作用,以及其在云计算领域的深远影响,为读者提供了关于Docker技术全面且深入的洞见。关注【TechLeadCloud】,分享互......
  • vue2当中使用svg
    1、引入依赖npminstall  svg-sprite-loader-D2、在src文件夹下新建文件夹存放svg图 3、封装公共svg组件 3、全局注册使用(避免使用时还需要再去引入封装的svg组件) 4、在vue.config.js当中增加svg配置 5、使用用例 ......
  • 使用nssm打包.net core api服务
     去官网下载nssm,然后cmd进入nssm的目录。下载地址:http://www.nssm.cc/download  命令行打开services.msc,就会发现成功了或者    这时候你的api就变成了windowsservice啦!......
  • springboot部署在服务器上使用图片上传功能隔一段时间就会报错
    新写的一个项目,使用springboot实现上传图片的功能接口,然后刚开始部署在服务器上是正常使用的,但是隔一段时间就会发生上传失败,需要重新部署之后又正常,报错内容是Thetemporaryuploadlocation[/tmp/tomcat.7629195566189872429.5002/work/Tomcat/localhost/ROOT]isnotvalid......
  • Linux系统使用nmcli命令配置网络(永久有效)
        前言:原文在我的博客网站中,持续更新数通、系统方面的知识,欢迎来访!使用nmcli命令配置网络https://myweb.myskillstree.cn/88.html       目录1、配置Network-Manager接管网络(Ubuntu需要,Centos不需要)2、nmcli的相关配置使用nmcli添加一个网卡并配置静态i......
  • CAPL如何使用socket套接字实现TCP通信(数据传输)
    书接上回《CAPL如何使用socket套接字实现TCP通信(建立连接)》,当TCP建立连接后,就可以传输数据了。不管是client还是server,都是使用相同的函数传输应用层数据。tcpSend(clientSocket,"12345",5);但这里有一点值得注意:server端传输数据的socket是serverDataSocket,而不是s......
  • yarn的安装和使用
    Yarn是一个JavaScript包管理工具,用于管理项目中的依赖项。它可以替代npm,并提供更快的下载速度和更可靠的依赖管理。下面是关于Yarn的安装和使用方法:安装Yarn使用npm安装Yarn(需要先安装Node.js):npminstall-gyarn使用Homebrew(适用于macOS用户):brewins......
  • 如何使用V免签+彩虹易支付个人支付对接支付宝、微信搭建安装流程记录
    这两天没事闲的折腾了下个人免签支付,我相信有很多小伙伴也有这个痛点!这里记录下安装流程,年纪大了以免下次重搭忘记!源码下载以后开始服务器安装,简单点就上宝塔或aapanel(宝塔海外版)!首先ssh登录服务器,然后sudo-i切换到root用户。我这里选择安装宝塔海外版aapanel(英文界面......