我使用的框架,它有一个类注册,我能注册重载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