• 重载new delete操作符是怎么调用的


    自定义的new操作符是怎么对英语new 一个对象的?自定义的delete操作符什么情况下得到调用?new一个对象时出现异常需要我操心内存泄露吗?下面的一个例子帮我们解开所有的疑惑。

    1. 调用规则  new(A,B) class(param)  -> operator new(sizeof(class), A, B)

    2. 自定义的操作符只用new对象异常的时候才会得到调用机会,而且调用哪个delete和你用的那个new一一对应,

    规则是 new(X, Y) class(param);  -> delete(X, Y) class;-> operator delete(X, Y, void* p)

    3. 我们不用担心new对象时候引发的异常的内存泄露,c++系统会我们在异常发生的第一时间(哪怕我们定义了异常处理函数)帮助我们释放内存。


    /*
    运行结果:
    Normal operator new called.
    Normal operator delete called.
    
    Custom operator new called.
    Normal operator new called.
    Normal operator delete called.
    
    Normal operator new called.
    Normal operator delete called.
    exception
    
    Custom operator new called.
    Normal operator new called.
    Custom operator delete called.
    Normal operator delete called.
    exception
    
    请按任意键继续. . .
    */
    
    #include <cstddef>
    #include <new>
    #include <iostream>
    using namespace std;
    
    void * operator new(std::size_t sz)
    	throw(std::bad_alloc)
    {
    	std::cout << "Normal operator new called." << std::endl ;
    
    	void * p = std::malloc(sz) ;
    	if (!p)
    		throw std::bad_alloc() ;
    	return p ;
    }
    
    void operator delete(void * p) throw()
    {
    	std::cout << "Normal operator delete called." << std::endl ;
    	if (p)
    		std::free(p) ;
    }
    
    void * operator new(std::size_t sz, std::ostream & out)
    	throw(std::bad_alloc)
    {
    	out << "Custom operator new called." << std::endl ;
    	return ::operator new(sz) ;
    }
    
    void operator delete(void * p, std::ostream & out) throw()
    {
    	out << "Custom operator delete called." << std::endl ;
    	::operator delete(p) ;
    }
    
    class T
    {
    public:
    	T(bool should_throw) { if (should_throw) throw 1 ; }
    } ;
    
    int main()
    {
    	// Calls normal new, normal delete.调用标准的new、delete
    	T * p = new T(false) ;
    	delete p ;
    	std::cout << std::endl ;
    
    	// Calls custom new, normal delete.  调用自定义的new, 标准的delete
    	//调用规则  new(A,B) class(param)  -> operator new(sizeof(class), A, B)
    	p = new(std::cout) T(false) ;
    	delete p ;
    	std::cout << std::endl ;
    
    	// Calls normal new, normal delete.  调用标准的new、delete 而且抛出异常
    	try
    	{
    		T * p = new T(true) ;
    		cout << "accident happens, should not get here" << endl;
    		//上面语句,没打印,说明不是代码调用了delete,而是c++框架自动为我们掉delete,即new失败时系统会自动为我们调用delete函数
    		delete p ;
    	}
    	catch (...)
    	{
    		cout << "exception" << endl;
    	}
    	std::cout << std::endl ;
    
    	// Calls custom new, custom delete. 调用自定义的new、delete,这个使用我们自定义的delete会得到调用
    	// 规则是 new(X, Y) class(param);  -> delete(X, Y) class;
    	try
    	{
    		T * p = new(std::cout) T(true) ;
    		cout << "accident happens, should not get here" << endl;
    		delete p ;
    	}
    	catch (...)
    	{
    		cout << "exception" << endl;
    	}
    	std::cout << std::endl ;
    }


  • 相关阅读:
    自我介绍
    java web 学习计划
    团队-团队编程项目中国象棋-代码设计规范
    团队-中国象棋游戏-设计文档
    团队-象棋游戏-开发环境搭建过程
    结对-贪吃蛇游戏-开发环境搭建过程
    结对-结对编项目贪吃蛇-设计文档
    20170912-构建之法:现代软件工程-阅读笔记
    课后作业-阅读任务-阅读提问-1
    团队-团队编程项目中国象棋-成员简介及分工
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3315603.html
Copyright © 2020-2023  润新知