如果我重載操作new
和delete
一類具有一個嵌套類:重載解析關於嵌套類
class A
{
public:
static void* operator new(size_t);
static void operator delete(void*);
class B;
}
會爲A::B
對象中A::B
對象和分配的情況下,分配使用重載A::new
和A::delete
或全球默認?
如果我重載操作new
和delete
一類具有一個嵌套類:重載解析關於嵌套類
class A
{
public:
static void* operator new(size_t);
static void operator delete(void*);
class B;
}
會爲A::B
對象中A::B
對象和分配的情況下,分配使用重載A::new
和A::delete
或全球默認?
首先,機會非常高,你不需要超載new
或delete
,並應避免這樣做。
由此可見,重載運營商將申請A
,而不是A::B
。如果你想讓B超載的話,你需要在類B
中超載。
有關如何重載new
和delete
一個例子:http://www.cprogramming.com/tutorial/operator_new.html
號
class A
{
public:
A(){printf("A\n");}
~A(){}
static void* operator new(size_t t){
printf("A new\n");
::operator new(t);
}
static void operator delete(void* t){
printf("A delete\n");
::operator delete(t);
}
void check_B(){
b = new B();
::operator delete(b);
}
class B{
public:
B(){}
};
B* b;
};
class C : public A {
};
測試:
int main(void)
{
A* a = new A;
printf("\ncheck ------\n");
a->check_B();
printf("\ncheck ------\n");
delete a;
C* c = new C;
A* cc = new C;
delete c;
delete cc;
return 0;
}
輸出:
甲
新的A
檢查------
檢查------
一個刪除
新
一個
一新
一個
一個刪除
一個刪除
成功運行(總時間:64ms的)
的valgrind:
==9318==
==9318== HEAP SUMMARY:
==9318== in use at exit: 0 bytes in 0 blocks
==9318== total heap usage: 4 allocs, 4 frees, 25 bytes allocated
==9318==
==9318== All heap blocks were freed -- no leaks are possible
==9318==
==9318== For counts of detected and suppressed errors, rerun with: -v
==9318== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 2 from 2)
這不會是連要求new A[]
你沒有你超負荷operator new[]()
以及。您需要相應地將它們重載爲嵌套類A::B
。然而,正如我們所看到的,他們將被稱爲從A派生的類。
測試,測試,測試。測試總是比不測試更好。作者:我。