我使用的框架,它有一個類註冊,我能註冊重載delete運算符來刪除庫
Register r;
A * a1 = new A();
r->register(a1);
A * a2 = new A();
r->register(a2);
註冊將採取所有權A的情況下,在其中,並刪除所有已註冊分配的東西A
當超出範圍。
我要修改共享庫(。所以在我的情況)A
的行爲,所以,我會做這樣的事情(庫):
class B : public A {
...
}
B * get_customized_a() {
return new B();
}
然後在主程序
Register r;
A * a1 = get_customized_a();
r->register(a1);
但現在a1
將在主程序中被刪除,而不是在圖書館!我認爲這是一個很大的禁忌。
那麼如何解決這個問題?
我提出了兩個解決方案:
1)使用和插件通過獨立的功能
定製:
void customize_a(A * a) { ... }
主程序
:
Register r;
A * a1 = new A();
customize_a(a1);
r->register(a1);
我一定要Ÿ我不喜歡那麼多:/
2)過載主程序刪除運營商B類的插件,
class B : public A {
...
static void operator delete(void * ptr) {
::operator delete(ptr);
}
}
:
Register r;
A * a1 = get_customized_a();
r->register(a1);
然而,我從來沒有過載operator delete
之前,所以我不知道這是否會甚至工作(如預期)。
3)是否有我錯過任何方法?有更好的解決方案嗎?
謝謝大家。
'A'是否有虛擬dtor?另外,你在哪個平臺上? – Deduplicator 2014-10-04 18:50:51
不,如果我正確地閱讀源代碼,'A'沒有虛擬驅動器。平臺是Linux,AMD64 – Paladin 2014-10-04 18:56:39
如果是Linux,你實際上不需要特別關心模塊邊界。儘管通過沒有虛擬dtor的基本類型刪除仍然保持UB。 – Deduplicator 2014-10-04 18:58:29