[英]Overload resolution of operator new regarding nested classes
如果我為具有嵌套類的類重載operator 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
並且應該避免這樣做。
Baring that,重載的運算符將應用於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.
檢查------
檢查------
刪除
一個新的
一個
一個新的
一個
刪除
刪除
RUN SUCCESSFUL(總時間: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)
除非你重載operator new[]()
,否則它甚至不會被稱為new A[]
。 您需要相應地為嵌套類A::B
重載它們。 但是正如我們所看到的那樣,它們將被調用來自A的類。
測試,測試,測試。 測試總是優於不測試。 作者:我。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.