【发布时间】:2014-10-04 18:48:25
【问题描述】:
我使用的框架有一个 Register 类,我可以在其中注册 A 的实例。
Register r;
A * a1 = new A();
r->register(a1);
A * a2 = new A();
r->register(a2);
Register 将取得所有权并在超出范围时删除所有已注册的As。
我想修改As 在共享库中的行为(在我的例子中是.so),所以,我要做这样的事情(在库中):
class B : public A {
...
}
B * get_customized_a() {
return new B();
}
然后在主程序中
Register r;
A * a1 = get_customized_a();
r->register(a1);
但现在a1 将在主程序中被删除,而不是在库中!据我了解,这是一个很大的禁忌。
那么如何解决呢?
我想出了两个解决方案:
1) 使用A并通过单机功能自定义
在插件中:
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 吗?另外,你在哪个平台上? -
不,如果我正确读取源代码,
A没有虚拟 dtor。平台是Linux,AMD64 -
如果是 Linux,你真的不需要特别关心模块边界。但是,通过没有虚拟 dtor 的基本类型删除仍然是 UB。
-
Sooo... 在 linux 上我可以安全地在主程序中删除共享库中分配的内容?这种在实践中有效的行为,还是一直有效?
-
还有任何想法如何处理虚拟 dtor 的缺失? ://
标签: c++ c++11 shared-libraries