假設我有一個超載的類operator new
。我可以使用全局運算符new作爲運算符new重載的類嗎?
class Class {
public:
void* operator new(size_t);
void operator delete(void*);
};
會該類的對象總是與重載operator new
被分配當我使用new Class()
或者是有可能,當new Class()
結構出現在代碼中的默認operator new
使用?
假設我有一個超載的類operator new
。我可以使用全局運算符new作爲運算符new重載的類嗎?
class Class {
public:
void* operator new(size_t);
void operator delete(void*);
};
會該類的對象總是與重載operator new
被分配當我使用new Class()
或者是有可能,當new Class()
結構出現在代碼中的默認operator new
使用?
重載operator new
和operator delete
會一直使用,除非你明確做這樣的事情:或者
// Allocate using global new.
MyClass* my_object = ::new MyClass();
// Use object normally.
my_object->my_method();
// Deallocate using global delete.
::delete my_object;
,作爲一個有點極端的說明性的例子,這樣的事情:
#include <new>
// Use global placement new to allocate in a buffer created by global new.
MyClass* my_object = ::new(::operator new(sizeof(MyClass))) MyClass()
// Use object normally.
my_object->my_method();
// Explicitly invoke destructor.
my_object->~MyClass();
// Explicitly deallocate memory.
::operator delete(my_object);
希望這幫助。
我能想到的唯一可能的例外是放置新(discussed here),但這是一種不同的語法。
使用範圍分辨率操作符(::)來調用全局定義爲operator new
,否則會一直使用重載的operator new
,除非ofcourse在placement new operator
情況下,這是無論如何不打算過載。
class Test {
public:
void* operator new(size_t);
void operator delete(void*);
};
int main()
{
Test* pTest1 = ::new Test();
Test* pTest2 = new Test();
/*
do some stuff
*/
::delete pTest1;
delete pTest2;
return 0;
}
請注意使用刪除操作符的相應定義。
順便說一句,放置新的可以被重載 - http://stackoverflow.com/questions/3675059/how-could-i-sensibly-overload-placement-operator-new – sharptooth 2010-09-09 12:47:50
是的,我的意思是OP不打算超載在他的例子中。 – Hemant 2010-09-09 12:53:04
@sharptooth:不,它不能。 – GManNickG 2010-09-09 13:47:21