ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C++ new/delete

2022-03-20 16:05:30  阅读:140  来源: 互联网

标签:变量 C++ 重载 内存 operator new delete size


  • 定义

    new/delete动态管理对象,new[]/delete[]动态管理对象数组。
    在C++中,int 、char等内置类型的变量也是存在构造函数和析构函数的,只是通常对它们,系统调用了默认的构造函数来初始化以及默认的析构(编译器优化)。所以new int、new int(3)看起来和普通的定义好像没什么区别。 但对于自定义类型的对象,此种方式在创建对象的同时,还会将对象初始化好;于是new/delete、new []/delete []方式管理内存相对于malloc/free的方式管理的优势就体现出来了,因为它们能保证对象一被创建出来便被初始化,出了作用域便被自动清理。

  • new

    1、new:指我们在C++里通常用到的运算符,有new和::new之分,前者位于std,后者位于类中。
    2、operator new(): 指对new的重载形式,它是一个函数,并不是运算符,分为全局重载和类重载 全局重载是void* ::operator new(size_t size) 在类中重载形式 void* A::operator new(size_t size)。还要注意的是这里的operator new()完成的操作一般只是分配内存,事实上系统默认的全局::operator new(size_t size)也只是调用malloc分配内存,并且返回一个void*指针。而构造函数的调用(如果需要)是在new运算符中完成的。如果类重载了operator new,那么将调用A::operator new(size_t ),如果没有重载,就调用::operator new(size_t )。要实现不同的内存分配行为,应该重载operator new,而不是new

    C++内存布局

    高地址内核空间(用户代码不能读写)
    栈(向下增长)
    内存映射段(文件映射、动态库)
    堆向上增长
    BSS段(未初始化全局变量、静态变量)
    只读数据段
    数据段(已初始化全局变量、静态变量)
    低地址代码段(可执行代码)

    大端和小端

    大端:变量的高字节放到内存的低地址中(变量的低字节放到内存的高地址中);
    小端:变量的高字节放到内存的高地址中(变量的低字节放到内存的低地址中)。
    例子:对于int类型变量x=0x30313233,在x86下,考虑到在内存中是按照字节为单位进行数据排布,那么会把0x30,0x31,0x32,0x33这4个值按照某种顺序(大端或者小端)进行存储:从0x30到0x33依次为变量的高字节到低字节,如果是大端字节序存储,则从低内存地址到高内存地址,依次存放:0x30, 0x31, 0x32, 0x33;如果是小端字节序存储,则从低内存地址到高内存地址,依次存放:0x33, 0x32, 0x31, 0x30
    在这里插入图片描述

    例子:

    void test_little_or_big_endian() {
    	int x;
    	cout << "sizeof(int) is " << sizeof(int) << endl;
    	char x0, x1, x2, x3;
    	x = 0x30313233;
    	cout << *((char*)&x) << endl;
    	x0 = ((char*)&x)[0];
    	x1 = ((char*)&x)[1];
    	x2 = ((char*)&x)[2];
    	x3 = ((char*)&x)[3];
     
     
    	cout << "x0=" << x0 << endl;
    	cout << "x1=" << x1 << endl;
    	cout << "x2=" << x2 << endl;
    	cout << "x3=" << x3 << endl;
        /*
        对于小端序,输出
        x0=3   
        x1=2
        x2=1
        x3=0   //0x30对应到十进制的48,也即是ascii的'0',作为char类型输出显示为0
        */
    }
    

标签:变量,C++,重载,内存,operator,new,delete,size
来源: https://blog.csdn.net/a777122/article/details/123608223

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有