memory management 2

class B 
{	
public:
	virtual ~B();	
	void operator delete  (void*, size_t) throw();		
	void operator delete[](void*, size_t) throw();		
	void f(void*, size_t) throw();		
};

class D : public B
{		
public:		
	void operator delete  (void*) throw();		
	void operator delete[](void*) throw();		
};
// Why do B's operators delete have a second parameter, whereas D's do not?
// should provide new() and new[] ().
// Always explicitly declare operator new() and operator delete() as static functions. They are never nonstatic member functions.
// 1.
D* pd1 = new D; 
delete pd1;  

B* pb1 = new D;
delete pb1;

D* pd2 = new D[10];
delete[] pd2;

B* pb2 = new D[10];
delete[] pb2;
// Never treat arrays polymorphically.

// 2.
typedef void (B::*PMF)(void*, size_t); 
PMF p1 = &B::f;  // fine
PMF p2 = &B::operator delete; // error, because static function.

// 3.
class X 
{
public:
	void* operator new( size_t s, int ) throw( bad_alloc )
	{
		return ::operator new( s );
	}
}; // this invites a memory leak. because it lost operator delete.


class SharedMemory
{
public:
	static void* Allocate( size_t s )
	{
		return OsSpecificSharedMemAllocation( s );
	}
	
	static void  Deallocate( void* p, int i = 0 )
	{
		OsSpecificSharedMemDeallocation( p, i );
    }
	
};

class Y
{		
public:		
   void* operator new( size_t s,SharedMemory& m ) throw( bad_alloc )			
    {		
		return m.Allocate( s );		
    }

    void  operator delete( void* p,	SharedMemory& m, int i ) throw()	
    {	
		m.Deallocate( p, i );	
    }	//This Y::operator delete() is useless because it can never be called.
	
};
// think about the flowing.
SharedMemory shared; 
...
new (shared) Y; // if Y::Y() throws, memory is leaked


// the replacement global operator delete() is going to delete memory allocated normally by the default ::operator new(), 
// not by SharedMemory::Allocate().
void operator delete( void* p ) throw()
{	
    SharedMemory::Deallocate( p );	
}

void operator delete( void* p,std::nothrow_t& ) throw()					 					 
{		
    SharedMemory::Deallocate( p );		
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值