gpt4 book ai didi

c++ - 禁止/重定向 C++ 删除?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:45:18 26 4
gpt4 key购买 nike

我有一个模块 (dll/so),它导出一个工厂函数,该函数返回一个对象,然后被调用。然后使用模块的接口(interface)(纯虚拟)用户可以创建不同的对象。所有对象创建都是通过接口(interface)进行的,因此使用与我的模块关联的运行时而不是应用程序运行时进行。

由于分配发生在模块内部,删除也需要,因为如果应用程序与我的模块有不同的运行时,gpf/segfault 时间。所以我有一个“发布”成员,它执行 self 删除。

void foo::release(void) 
{
delete this;
}

一切正常,但它确实需要模块的用户表现良好。

我的问题是:

  • 是否有可能阻止某人直接对我的对象发出删除(或重定向它以从我的模块内存池中删除)?
  • 如果不是作为备用计划,是否可以在我的对象中检测到这一点,以便我可以抛出一个断言来强制良好行为?

例如:

iFoo* foo = createFoo ();
foo->release(); // Allowed and expected
delete foo; // Disallowed

最佳答案

在对 OP 的评论中,@dave 建议将纯接口(interface)中的析构函数声明为 protected 而不是 public。这将彻底阻止外部代码(即,实现类的外部代码)调用 delete

例如:

class IFoo
{
protected:
virtual ~IFoo() { }

public:
virtual void release() = 0;
};

class Foo : public IFoo
{
public:
void release() override
{
delete this;
}
};

IFoo* createFoo()
{
return new Foo();
}

int main()
{
auto foo = createFoo();
foo->release(); // Expected
delete foo; // Cannot access protected destructor of IFoo

Return 0;
}

由于您的工厂函数仅公开纯接口(interface),因此如果实现类恰好提供公共(public)析构函数,则此方法不会失效。如果 Foo 声明了一个公共(public)析构函数,编译器错误仍然会出现在 main 中,因为 main 不知道它实际上是在处理一个 Foo.

关于c++ - 禁止/重定向 C++ 删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22648891/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com