3 回答
TA貢獻1829條經驗 獲得超7個贊
我通常會嘗試用不同的方式來區分兩者,以便更好地區分兩者,但無論如何這都是一個很好的問題。
運算符new是一個分配原始內存的函數 - 至少在概念上,它沒有太大的不同malloc()。雖然這是相當不尋常的,除非你正在編寫類似于你自己的容器,你可以直接調用operator new,例如:
char *x = static_cast<char *>(operator new(100));
也可以在全局或特定類中重載operator new。IIRC,簽名是:
void *operator new(size_t);
當然,如果重載運算符new(全局或類),您還需要/也需要重載匹配的運算符delete。對于它的價值,還有一個單獨的運算符new []用于為數組分配內存 - 但你幾乎肯定最好完全忽略整個混亂。
新運算符是您通常用于從免費商店創建對象的運算符:
my_class *x = new my_class(0);
兩者之間的區別在于operator new 只分配原始內存,沒有別的。new運算符首先使用operator new來分配內存,然后它調用正確類型對象的構造函數,因此結果是在該內存中創建的真實活動對象。如果該對象包含任何其他對象(嵌入式或基類),那么這些構造函數也會被調用。
TA貢獻1852條經驗 獲得超1個贊
“運營商新”
class Foo
{
public:
void* operator new( size_t );
}
“新運營商”:
Foo* foo = new Foo();
在這個例子中,new Foo()調用Foo::operator new()
換句話說,“new operator”調用“ operator new()”就像+運算符調用一樣operator +()
- 3 回答
- 0 關注
- 446 瀏覽
添加回答
舉報
