100 C++内存高级话题 new 细节探秘,重载类内 operator new ,delete

本文主要是介绍100 C++内存高级话题 new 细节探秘,重载类内 operator new ,delete,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一 new 内存分配细节探秘

我们以分配10个char为例,说明,观察内存发现,当delete 的时候,实际上很多内存都改变了。

实际上 new 内存不是一个简单的事情。为了记录和管理分配出去的内存,额外分配了不少内存,造成了浪费。尤其是多次申请小块的内存,浪费更严重。

不同的编译器对于这块实现是不同的。

但是功能都是大同小异的,要管理 分配出去的内存,考虑效率等。

二 重载类中的 operator new 和 operator delete 操作符

前提

从前面的知识我们知道:当你new Teacher后,主要代码逻辑如下:

Teacher *ptea = new Teacher;

        operator new();

                malloc();

        Teacher::Teacher();

-----------------------------------------

delete ptea;

        Teacher::~Teacher();

        operator delete();

                free();

思路

我们这里就是要重写operator new()方法,C++编译器在operator new()方法中调用了 malloc()方法分配内存。因此我们重写时也需要malloc内存。

我们这里就是要重写operator delete()方法,C++编译器在operator delete()方法中调用了 free()释放内存。因此我们重写时也需要free内存。

写法

    static void* operator new(size_t size) {
        Teacher35* ppoint = (Teacher35 *)malloc(size);
        return ppoint;
    }
    static void operator delete(void *phead) {
        free(phead);
    }

class Teacher35 {
public:Teacher35() {cout << "Teacher35 gouzao fangfa " << endl;//3}~Teacher35() {cout << "Teacher35 xigou" << endl;//5}//static void* operator new(size_t size) {//	Teacher35* ppoint = (Teacher35 *)malloc(size);//2. 在teacher35有一个int的时候,size是4//	return ppoint;//}//static void operator delete(void *phead) {//	free(phead);//6//}static void* operator new(size_t size);static void operator delete(void *phead);int mage;
};
void* Teacher35::operator new(size_t size) {Teacher35* ppoint = (Teacher35 *)malloc(size);return ppoint;
}void Teacher35::operator delete(void *phead) {free(phead);
}void main() {Teacher35 *ptea = new Teacher35; //1cout << "111" << endl;delete ptea; //4cout << "222" << endl;
}

三 重载类中的 operator new[] 和 operator delete[] 操作符

class Teacher35 {
public:Teacher35() {cout << "Teacher35 gouzao fangfa " << endl;//3}~Teacher35() {cout << "Teacher35 xigou" << endl;//5}static void* operator new(size_t size) {Teacher35* ppoint = (Teacher35 *)malloc(size);//2. 在teacher35有一个int的时候,size是4return ppoint;}static void operator delete(void *phead) {free(phead);//6}//static void* operator new(size_t size);//static void operator delete(void *phead);static void* operator new[](size_t size) {Teacher35* ppoint = (Teacher35 *)malloc(size);//2. 在teacher35[3]的时候,加上4个字节,这4个字节 存储的是3,因此 size 大小是 3个teacher的大小 = 3*sizeof(Teacher)+ 4个字节 记录几个teacher(也就是3)return ppoint;}static void operator delete[](void *phead) {free(phead);//6}int mage;
};
//void* Teacher35::operator new(size_t size) {
//	Teacher35* ppoint = (Teacher35 *)malloc(size);
//	return ppoint;
//}
//
//void Teacher35::operator delete(void *phead) {
//	free(phead);
//}void main() {//Teacher35 *ptea = new Teacher35; //1//cout << "111" << endl;//delete ptea; //4//cout << "222" << endl;Teacher35 *ptea = new Teacher35[3];delete[] ptea;
}

这篇关于100 C++内存高级话题 new 细节探秘,重载类内 operator new ,delete的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/672393

相关文章

JavaScript中的高级调试方法全攻略指南

《JavaScript中的高级调试方法全攻略指南》什么是高级JavaScript调试技巧,它比console.log有何优势,如何使用断点调试定位问题,通过本文,我们将深入解答这些问题,带您从理论到实... 目录观点与案例结合观点1观点2观点3观点4观点5高级调试技巧详解实战案例断点调试:定位变量错误性能分

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

从基础到高级详解Python数值格式化输出的完全指南

《从基础到高级详解Python数值格式化输出的完全指南》在数据分析、金融计算和科学报告领域,数值格式化是提升可读性和专业性的关键技术,本文将深入解析Python中数值格式化输出的相关方法,感兴趣的小伙... 目录引言:数值格式化的核心价值一、基础格式化方法1.1 三种核心格式化方式对比1.2 基础格式化示例

Redis实现高效内存管理的示例代码

《Redis实现高效内存管理的示例代码》Redis内存管理是其核心功能之一,为了高效地利用内存,Redis采用了多种技术和策略,如优化的数据结构、内存分配策略、内存回收、数据压缩等,下面就来详细的介绍... 目录1. 内存分配策略jemalloc 的使用2. 数据压缩和编码ziplist示例代码3. 优化的

Android协程高级用法大全

《Android协程高级用法大全》这篇文章给大家介绍Android协程高级用法大全,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友跟随小编一起学习吧... 目录1️⃣ 协程作用域(CoroutineScope)与生命周期绑定Activity/Fragment 中手

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

Python内存优化的实战技巧分享

《Python内存优化的实战技巧分享》Python作为一门解释型语言,虽然在开发效率上有着显著优势,但在执行效率方面往往被诟病,然而,通过合理的内存优化策略,我们可以让Python程序的运行速度提升3... 目录前言python内存管理机制引用计数机制垃圾回收机制内存泄漏的常见原因1. 循环引用2. 全局变

Go之errors.New和fmt.Errorf 的区别小结

《Go之errors.New和fmt.Errorf的区别小结》本文主要介绍了Go之errors.New和fmt.Errorf的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考... 目录error的基本用法1. 获取错误信息2. 在条件判断中使用基本区别1.函数签名2.使用场景详细对

C++ STL-string类底层实现过程

《C++STL-string类底层实现过程》本文实现了一个简易的string类,涵盖动态数组存储、深拷贝机制、迭代器支持、容量调整、字符串修改、运算符重载等功能,模拟标准string核心特性,重点强... 目录实现框架一、默认成员函数1.默认构造函数2.构造函数3.拷贝构造函数(重点)4.赋值运算符重载函数

深度解析Python yfinance的核心功能和高级用法

《深度解析Pythonyfinance的核心功能和高级用法》yfinance是一个功能强大且易于使用的Python库,用于从YahooFinance获取金融数据,本教程将深入探讨yfinance的核... 目录yfinance 深度解析教程 (python)1. 简介与安装1.1 什么是 yfinance?