unity new byte 释放_C++幕后故事(九)--我们来new个对象

本文探讨了C++中的operator new操作符的工作原理,包括调用流程和重载的意义,特别是在解决多线程内存问题中的作用。此外,介绍了placement new的概念,其在STL容器如vector中的应用,以及重载的注意事项。同时,讲解了set_new_handler函数的使用,用于处理new操作失败的情况。最后总结了这些概念在内存管理和优化中的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

读者如果觉得我文章还不错的,,希望可以多多支持下我,文章可以转发,但是必须保留原出处和原作者署名。为了获取更好的阅读体验请关注微信公众号。更多内容请关注我的微信公众号:cpp手艺人

cc862dc69db0644014afc00424fe31ad.png

今天我们主要学习知识点:

1.new的调用流程。
2.我们重载了new之后能干啥。
3.placement new干啥的。
4.set_new_handler是什么。

1. operator new操作符的原理

1.1 operator new 调用流程

测试代码如下:

/****************************************************************************
**
** Copyright (C) 2019 635672377@qq.com
** All rights reserved.
**
****************************************************************************/

/*
    测试对象的new、delete,在VS2017更容易观察
*/
#ifndef obj_new_delete_h
#define obj_new_delete_h

#include <new>
#include <memory>
#include <iostream>

using std::cout; 
using std::endl;

namespace obj_new_delete 
{
    

class Obj
{
    
public:
    Obj():mCount(0) {
     cout << "Obj ctor" << endl; }
    ~Obj() {
     cout << "~Obj dtor" << endl; }

private:
    int mCount;
};

void test_new_obj()
{
    
    Obj *obj = new Obj();
delete obj;
}
}
#endif // obj_new_delete_h

我们在Obj *obj = new Obj();处下个断点,再打开反汇编窗口,我摘取主要的代码。 markdown的汇编代码不能高亮,看的很难受啊,还是前往公众号可以获取更好的阅读体验。

; Obj *obj = new Obj();
00DE2C47  push        4  
00DE2C49  call        operator new (0DE141Ah)  
00DE2C4E  add         esp,4  
00DE2C51  mov         dword ptr [ebp-0ECh],eax  
00DE2C57  mov         dword ptr [ebp-4],0  
00DE2C5E  cmp         dword ptr [ebp-0ECh],0  
00DE2C65  je          obj_new_delete::test_new_obj+7Ah (0DE2C7Ah)  
00DE2C67  mov         ecx,dword ptr [ebp-0ECh]  
; 调用对象的构造函数
00DE2C6D  call        obj_new_delete::Obj::Obj (0DE1456h)

我在::operator new的汇编代码处,点击菜单“转到源代码”,就可以还原为C++代码,这个代码的源文件叫做new_scalar.cpp:

void* __CRTDECL operator new(size_t const size)
{
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值