首页 > 编程语言 >【侯捷C++面向对象笔记】补充5-new & delete重载

【侯捷C++面向对象笔记】补充5-new & delete重载

时间:2024-01-30 21:34:58浏览次数:27  
标签:函数 C++ 重载 operator 侯捷 new Foo delete

平时所使用的new和delete操作,称之为表达式,一般由好几个步骤组成。

如上图所示,new表达式会被编译器转化为三个步骤。

new表达式不能重载,但其中operator new是可以重载的。

➡️全局::operator new的重载

why 不能放在namespace内?因为全局operator new是放在default global namespace中的。

➡️类成员函数operator new的重载

operator new/delete operator new[]/delete[]
对象 对象array
sizeof(Foo) sizeof(Foo)*N + 4 (4:存放数组元素个数N)

注意:类成员函数operator new/delete实际都是静态的。本身new操作是创建对象时进行的,而非静态函数需要对象来调用。想在对象创建之前就调用成员函数,那么该成员函数必定是静态函数。(不需要加static关键字,因为编译器默认operator new/delete为静态函数)

一个过程示例

  • Foo* pf = new Foo;编译器寻找类中有没有重载的operator new,若没有则调用全局的::operator new。
  • Foo* pf = ::new Foo;可以强制使用全局的::operator new。

两种情况下的内存操作实例(有无虚析构函数)

  • 有虚析构函数时,sizeof(Foo)会多4字节,因为需要维护一个虚指针。
  • new对象array时,相比对象的整包大小,额外需要4字节作为计数器存储array长度。
  • 析构和构造的顺序相反。

➡️重载operator new

  • class member operator new可以重载多个版本,但每个版本必须是不同的参数列表。
  • 第一个参数必须为size_t,其余参数称为placement arguments,写在new(...)括号内。

➡️重载operator delete

  • 也可以重载class member operator delete,称之为placement operator delete
  • 正常情况下不会被delete调用。只有在new调用的ctor抛出异常时,才会调用重载的operator delete。用来清理未创建成功的object的内存。

➡️应用operator new重载的示例

标签:函数,C++,重载,operator,侯捷,new,Foo,delete
From: https://www.cnblogs.com/rthete/p/17998023

相关文章

  • 【侯捷C++面向对象笔记】补充2-pointer-like & function-like class
    关键词:仿函数pointer-like:将一个类设计得像指针一样,通常通过重载*和->操作符实现。function-like:将类的成员设计得能像函数一样使用,通过重载()操作符实现。TipDemo应用:智能指针注意:->符号在作用一次后,会继续作用下去(不同于*号)Foof(*sp):f为一个Foo对象本体,使用时f.m......
  • 【侯捷C++面向对象笔记】补充3-template
    关键词:类模板,函数模板,成员模板,模板特化“泛化”和“特化”TipDemo类模板定义时需要显式地指定类型名。函数模板定义时编译器自动进行实参推导类型(但不提供隐式转换)。成员模板:模板中还包含模板模板(全)特化格式:template<>尖括号内为空模板偏特化(partia......
  • 【侯捷C++面向对象笔记】补充4-object model
    关键词:虚函数表,动态绑定,多态每个对象都维护自己的虚表指针,指向类的虚函数表。(所以对象的size比其包含的所有数据size多4,即虚指针大小)➡️动态绑定:(多态的实现原理)通过指针p找到对象c的vptr通过vptr找到classC的vtbl在vtbl中找到第n个虚函数并调用➡️子类调用父类函数隐......
  • 【侯捷C++面向对象笔记】String类
    关键词:动态内存分配,拷贝赋值,new/delete与Complex类最大的差别:有动态分配的内存空间(char*m_data)TipDemo拷贝赋值函数的一般结构拷贝赋值时,检测自我赋值非常重要自己的内存已经释放了,还怎么把自己赋给自己?new时做了什么?1.分配内存2.static_cast为相应类型指针......
  • KY146 魔咒词典C++
    构建一个map,还是查找问题。麻烦点就是要分解输入的过程#include<iostream>#include<string>#include<map>usingnamespacestd;intmain(){stringa,b;map<string,string>m;while(getline(cin,a)){//构建mapb.clear();if(a[0]==......
  • KY27 查找学生信息C++
    用map做查找就行了。#include<iostream>#include<string>#include<map>usingnamespacestd;structnode{stringname;stringx;intage;};typedefstructnodesinfo;intmain(){intn;while(cin>>n){map<......
  • c++ - 实现环形队列
    简介队列的核心思想是FIFO(FirstInFirstOut),即先入先出。入队(新增元素)必须从队尾加入,出队(删除元素)必须从队首出去。实现1、需要实现的方法#pragmaonce#include<iostream>usingnamespacestd;#ifndefMYQUEUE_H#defineMYQUEUE_H//环形队列的实现classMyQueue{......
  • C++ 避免不必要的复制进行优化的思路
    对于函数传入的参数,如果只是需要读取其中的值,一般来说,除了基础的int类型这种,建议声明为const&类型,这样避免不必要的复制操作。特殊的,std::vector进行增加元素时,可以考虑使用vec[0]=std::move(value),通过转移所有权来避免复制操作,因为vec[0]=value也存在复制操作。不......
  • no new changes
    nonewchangeshttps://gerrit-documentation.storage.googleapis.com/Documentation/2.16.4/error-no-new-changes.htmlWiththiserrormessageGerritrejectstopushacommitifthepushedcommitwasalreadysuccessfullypushedtoGerritinprojectscope.In......
  • 【C++】c++中的输入输出;缺省;重载;
    1、c++输入输出#include<iostream>//std是C++标准库的命名空间名,C++将标准库的定义实现都放到这个命名空间中usingnamespacestd;intmain(){ cout<<"Helloworld!!!"<<endl; return0;}//流插入运算符<<在一个语句中可以多次使用,如上面实例中所示,endl用于在行末添加......