考慮下面的代碼和下面的問題:有關操作問題的new()和operator delete()
/*
* GCC 4.4
*/
#include <iostream>
using namespace std;
class A {
public:
void* operator new(size_t s) {
cout << "A::operator new(size_t) called\n";
}
void operator delete(void* p) {
cout << "A::operator delete(void*) called\n";
}
void* operator new(size_t s, A* p) {
cout << "A::operator new(size_t, A*) called\n";
}
void operator delete(void* p, size_t s) {
cout << "A::operator delete(void*, size_t) called\n";
}
};
void* operator new(size_t s) {
cout << "::operator new(size_t) called\n";
}
void operator delete(void* p) {
cout << "::operator delete(void*) called\n";
}
void* operator new(size_t s, A* p) {
cout << "::operator new(size_t, A*) called\n";
}
void operator delete(void* p, size_t s) {
cout << "::operator delete(void*, size_t) called\n";
}
int main() {
A* p1 = new A(); // See question 1.
delete p1; // See question 2.
A* p2 = new (p1) A(); // See question 3.
delete p2; // See question 4.
}
下面的問題看似多餘莫名其妙。但是,我試圖區分的是C++標準規則中由實現定義的內容所定義的內容。
operator new(size_t)
在任何情況下使用(從A或從全局命名空間 拍攝,無論是默認或沒有)。還行吧。 現在嘗試,只除去void* A::operator new(size_t) {}
:爲什麼編譯器爲:error: no matching function for call to ‘A::operator new(unsigned int)’ note: candidates are: static void* A::operator new(size_t, A*)
的粗野,編譯器從全局命名空間 拿起
::operator new(size_t)
?爲什麼
operator delete(void*)
優選operator delete(void*, size_t)
(當這些版本都存在於其中operator delete (void*)
取自同一命名空間)?如果我刪除
void* A::operator new(size_t, A*)
, ,但爲什麼代碼不能編譯,儘管在全局命名空間中定義了相同版本的運算符?error: no matching function for call to ‘A::operator new(unsigned int, A*&)’ note: candidates are: static void* A::operator new(size_t)
爲什麼編譯器還是喜歡
operator delete (void*)
,雖然A::operator new(size_t, A*)
已使用 爲獲得P2?
這是很多問題。如果你想親自看看[n3242.pdf](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/),我會從'5.3開始.4新「(第110頁) – sehe
無論如何,我認爲所有的問題都與同一主題有關。 – Martin
如果有可能解決整個問題的單個答案,Q/A格式的效果最好。當幾個答案結合起來提供答案時,你會對接受答案的困惑感到困惑。這使得信息難以/不可能爲未來的SO搜索者找到。 – sehe