分享C++三种类型new类型的运算符使用详情

 更新时间:2022年04月10日 18:37:30   作者:hsy12342611  
这篇文章主要介绍了C++三种类型new运算符的使用详情,文章基于C++运算展开主题内容,具有一定的参考价值,需要的小伙伴可以参考一下

1.new操作符

new operator,平时用的最多的new操作符,其对应delete operator,不能被重载,其包含两个操作(既申请空间,又调用构造函数)

  • (1)使用::operator new申请内存
  • (2)调用类的构造函数
class CTestUse
{
public:
    CTestUse() { cout << __FUNCTION__ << endl; }
    virtual ~CTestUse() { cout << __FUNCTION__ << endl; }
 
private:
};
 
void test()
{
    string *pStr = new string("new operator");
    cout << *pStr << endl;
    delete pStr;
 
    CTestUse *pCase = new CTestUse;
    delete pCase;
}
 
 
int main(int argc, char *argv[])
{
    test();
 
    return 0;
}

运行结果如下:

2.::operator new

::operator new,只会申请空间,不会调用构造函数,可以被重载,其对应 ::operator delete (只申请空间)

2.1原始调用

class CTestUse1
{
public:
    CTestUse1() { cout << __FUNCTION__ << endl; }
    virtual ~CTestUse1() { cout << __FUNCTION__ << endl; }
    void show() { cout << __FILE__ << " " << __FUNCTION__ << endl; }
 
private:
};
 
 
void test1()
{
    CTestUse1 *pCase = (CTestUse1 *)::operator new (sizeof(CTestUse1));
    pCase->show();
    ::operator delete(pCase);
 
}
 
int main(int argc, char *argv[])
{
    test1();
 
    return 0;
}

运行结果如下:

2.2重载1

class CTestUse2
{
public:
    CTestUse2() { cout << __FUNCTION__ << endl; }
    virtual ~CTestUse2() { cout << __FUNCTION__ << endl; }
    void show() { cout << __FILE__ << " " << __FUNCTION__ << endl; }
 
    void* operator new(size_t size) {
        cout << __FUNCTION__ << endl;
        return ::operator new(size);
    }
 
    void operator delete(void* ptr) {
        cout << __FUNCTION__ << endl;
        ::operator delete(ptr);
    }
 
private:
};
 
void test2()
{
    CTestUse2 *pCase = new CTestUse2;
    pCase->show();
    delete pCase;
 
}
 
int main(int argc, char *argv[])
{
    test2();
 
    return 0;
}

运行结果如下:

2.3重载2

class CTestUse3
{
public:
    CTestUse3() { cout << __FUNCTION__ << endl; }
    virtual ~CTestUse3() { cout << __FUNCTION__ << endl; }
    void show() { cout << __FILE__ << " " << __FUNCTION__ << endl; }
 
    void* operator new(size_t size, string str) {
        cout << __FUNCTION__ << str << endl;
        return ::operator new(size);
    }
 
    void operator delete(void* ptr) {
        cout << __FUNCTION__ << endl;
        ::operator delete(ptr);
    }
 
private:
};
 
void test3()
{
    CTestUse3 *pCase = new ("heshiyang") CTestUse3;
    pCase->show();
    delete pCase;
 
}
 
int main(int argc, char *argv[])
{
    test3();
 
    return 0;
}

运行结果如下:

3.place new

place new在已经构建好的内存中创建对象,其只会返回已经申请好的内存指针,多用在高性能场景下,提前申请好内存,可以节省申请内存开消 (只调用构造函数)

class CTestUse4
{
public:
    CTestUse4() { cout << __FUNCTION__ << endl; }
    virtual ~CTestUse4() { cout << __FUNCTION__ << endl; }
    void show() { cout << __FILE__ << " " << __FUNCTION__ << endl; }
 
    void* operator new(size_t size, void* p) {
        cout << __FUNCTION__ << endl;
        return p;
    }
 
    void operator delete(void* ptr) {
        cout << __FUNCTION__ << endl;
        ::operator delete(ptr);
    }
 
private:
};
 
void test4()
{
    char* pChar = new char[sizeof(CTestUse4)];
    CTestUse4* pCase = new (pChar) CTestUse4; //调用全局::new (pChar) CTestUse4,new (pChar) CTestUse4调用重载new
    //delete pCase;
    pCase->~CTestUse4();
}
 
int main(int argc, char *argv[])
{
    test4();
 
    return 0;
}

运行结果如下:

到此这篇关于C++三种类型new运算符的使用详情的文章就介绍到这了,更多相关C++ new运算符内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • OpenCV + MFC实现简单人脸识别

    OpenCV + MFC实现简单人脸识别

    这篇文章主要为大家详细介绍了OpenCV + MFC实现简单人脸识别,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • C语言中调用Swift函数实例详解

    C语言中调用Swift函数实例详解

    这篇文章主要介绍了C语言中调用Swift函数实例详解的相关资料,实现该功能可以通过定义全局的指向Blocks的对象指针来实现,需要的朋友可以参考下
    2017-07-07
  • Ubuntu 20.04 下安装配置 VScode 的 C/C++ 开发环境(图文教程)

    Ubuntu 20.04 下安装配置 VScode 的 C/C++ 开发环境(图文教程)

    这篇文章主要介绍了Ubuntu 20.04 下安装配置 VScode 的 C/C++ 开发环境,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • 实例讲解C语言编程中的结构体对齐

    实例讲解C语言编程中的结构体对齐

    这篇文章主要介绍了C语言编程中的结构体对齐,值得注意的是一些结构体对齐的例子在不同编译器下结果可能会不同,需要的朋友可以参考下
    2016-04-04
  • C++实现LeetCode(163.缺失区间)

    C++实现LeetCode(163.缺失区间)

    这篇文章主要介绍了C++实现LeetCode(163.缺失区间),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • 详谈C++中虚基类在派生类中的内存布局

    详谈C++中虚基类在派生类中的内存布局

    下面小编就为大家带来一篇详谈C++中虚基类在派生类中的内存布局。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • C语言实现bmp图像对比度扩展

    C语言实现bmp图像对比度扩展

    这篇文章主要为大家详细介绍了C语言实现bmp图像对比度扩展,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • C/C++ 避免数组越界的方法

    C/C++ 避免数组越界的方法

    这篇文章主要介绍了C/C++ 避免数组越界的方法,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-06-06
  • C语言实现简单弹跳球游戏

    C语言实现简单弹跳球游戏

    这篇文章主要为大家详细介绍了C语言实现简单弹跳球游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • 如何在Qt中实现关于Json 的操作

    如何在Qt中实现关于Json 的操作

    JSON是一种轻量级数据交换格式,常用于客户端和服务端的数据交互,不依赖于编程语言,在很多编程语言中都可以使用JSON,这篇文章主要介绍了在Qt中实现关于Json的操作,需要的朋友可以参考下
    2023-08-08

最新评论