博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
new函数的底层实现
阅读量:4042 次
发布时间:2019-05-24

本文共 1194 字,大约阅读时间需要 3 分钟。

举个栗子:Complex* pc = new Complex(1, 2); 此处new称为表达式或运算符new,编译器将其转化为一下代码:

Complex* pc;try{    void* mem = operator new(sizeof(Complex));  // 底层调用malloc函数分配内存    pc = static_cast
(mem); pc->Complex::Complex(1, 2); // 一般由分配器的construct函数完成,主要工作: // 使用placement new: new(mem)(arguments_list) // 即:pc = new(mem)(1,2)完成初始化 // 相应的析构对象时调用分配器的destroy函数,释放内 // 存则调用operator delete} catch( std::bad_alloc ){ // 处理可能出现的异常}

也就是创建新对象时,new做了两件事:分配内存、调用构造函数

深入探索C++对象模型,第45页。 class X定义了一个拷贝构造函数,一个虚析构函数,一个虚函数foo();

X foobar(){    X xx;    X *px = new X;    xx.foo();    px->foo();    delete px;    return x;}

这个函数可能在内部转换为//虚拟C++码

void foobar(X& _result){    //使用引用返回,属于编译器的优化了。    //构造    _result.X::X();    //申请内存    px = _new(sizeof(X));    //调用构造函数    if( px != 0)        px->X::X();    //成员函数的形式的转换,成员函数就是普通函数不过有一个this指针    foo(&_result);    //虚函数的基本调用方式,通过vptr来调用    (*px->vtbl[2])(px);    //调用虚析构函数    if( px != 0)    {        (*px->vtbl[1])(px);        _delete(px);    }    //不需要使用named return statement    //不需要摧毁Local object xx    //而是使用了传入参数_result    return;}

转载地址:http://taxdi.baihongyu.com/

你可能感兴趣的文章
QT打开项目提示no valid settings file could be found
查看>>
Win10+VS+ESP32环境搭建
查看>>
Ubuntu+win10远程桌面
查看>>
flutter-实现圆角带边框的view(android无效)
查看>>
android 代码实现圆角
查看>>
flutter-解析json
查看>>
android中shader的使用
查看>>
java LinkedList与ArrayList迭代器遍历和for遍历对比
查看>>
drat中构造方法
查看>>
JavaScript的一些基础-数据类型
查看>>
JavaScript基础知识(2)
查看>>
转载一个webview开车指南以及实际项目中的使用
查看>>
android中对于非属性动画的整理
查看>>
一个简单的TabLayout的使用
查看>>
ReactNative使用Redux例子
查看>>
Promise的基本使用
查看>>
coursesa课程 Python 3 programming 统计文件有多少单词
查看>>
coursesa课程 Python 3 programming 输出每一行句子的第三个单词
查看>>
Returning a value from a function
查看>>
coursesa课程 Python 3 programming Functions can call other functions 函数调用另一个函数
查看>>