【发布时间】:2014-05-04 03:22:32
【问题描述】:
我有一个模块 (dll/so),它导出一个工厂函数,该函数返回一个然后调用的对象。然后使用模块的接口(纯虚拟)用户可以创建不同的对象。所有对象的创建都是通过接口进行的,因此使用与我的模块关联的运行时而不是应用程序运行时进行。
由于分配是在模块内部进行的,因此删除也需要进行,因为如果应用程序的运行时间与我的模块不同,gpf/segfault 时间。所以我有一个“释放”成员,它执行自删除。
void foo::release(void)
{
delete this;
}
一切正常,但它确实需要模块的用户行为。
我的问题是:
- 是否可以阻止某人直接对我的对象发出删除操作(或将其重定向到从我的模块内存池中删除)?
- 如果不作为备用计划,是否可以在我的对象中检测到这一点,以便我可以抛出断言来强制执行良好的行为?
例如:
iFoo* foo = createFoo ();
foo->release(); // Allowed and expected
delete foo; // Disallowed
【问题讨论】:
-
您是否考虑过“制作私有析构函数”选项?
-
一个选择不表现的用户可能会在很多方面破坏你。让您的界面易于使用正确,难以使用错误,并且不要太担心恶意意图。
-
也许返回一个智能指针是为了? en.wikipedia.org/wiki/Smart_pointer
-
@dave,这可以用于接口吗?我的界面是 100% 纯的。客户端应用程序只知道接口,隐藏在模块内的实现标头中的私有“析构函数”是否仍会被捕获?如果是这样,那将完全解决我的担忧。
-
@Chris,声明一个私有析构函数会阻止类被继承,所以它应该被保护。然而,如果你不能阻止子类扩展你的纯接口来实现 public 析构函数,那么这个解决方案可能不适合你的问题。
标签: c++ destructor delete-operator