这是一个设计问题,假设C++和引用计数对象层次结构。我的代码库中的很多类都来自公共基类(ObjectBase),它实现了retain()和release()方法来增加和减少对象实例的引用计数。参考计数对象和多个分配器
对象的每个实例都可以使用多个用户可定义的内存分配器在堆栈或堆上创建。如果retainCount达到0,为了让对象实例在release()方法中自杀(删除这个),实例必须知道它已经构建了哪个分配器。现在,我使用任意的分配器为对象实例分配内存,然后调用placement new来构造对象实例,并在对象上调用setAllocator()方法来设置它已经创建的分配器。如果对象已经在堆栈上构建,则分配器将设置为NULL,并且release()不会调用delete。这个过程是非常多余的,可能容易出错(内存泄漏,如果我忘了打电话setAllocator,等...),理想情况下我会想使之成为一个一个步骤的过程是这样的:
Object* o = myPoolAllocator.allocate<Object>(constructor arguments...);
但是这使得它很难支持任意数量的构造函数参数。
我只是在寻找如何解决这个问题的想法。我非常喜欢能够引用计数对象而不必依靠智能指针的想法,特别是因为大多数类都来自公共基地,无论如何。
感谢您的帮助。
弗洛里安
卡萨布兰卡,感谢您的快速响应,并感谢您在我的OT中修复源标签!我已经考虑了一个类似于你的建议的方法,但正如你正确指出的那样,我不能够在栈上创建对象了。我曾考虑检查ObjectBase构造函数,分配器字段是否指向有效的分配器实例,如果没有,则考虑将对象放在堆栈上。然而,考虑到未初始化的分配器字段恰好指向有效的分配器的一些(尽管很小)的机会,这是危险的业务。 – FlorianZ 2010-08-22 04:47:44
@FlorianZ:查看我更新的答案,了解另一种可能的黑客行为。 – casablanca 2010-08-22 04:58:39
@casablanca。这也是一个不错的主意!我唯一担心的是它可能不是线程安全的。如果在运算符new返回后发生上下文切换,但在构造函数有机会使用currentAllocator变量之前该怎么办?如果分配然后在第二个线程中执行,则currentAllocator将受到影响。关于如何使您的解决方案线程安全的任何想法? – FlorianZ 2010-08-22 05:28:04