gpt4 book ai didi

c++ - Scoped Reference Idiom 的最佳实践?

转载 作者:太空狗 更新时间:2023-10-29 23:21:49 26 4
gpt4 key购买 nike

我刚被一个 bug 搞得焦头烂额,部分原因是我缺乏理解,部分原因是我认为我们的代码库中的设计欠佳。我很好奇如何改进我的 5 分钟解决方案。

我们正在使用引用计数对象,我们在这些类的对象上使用 AddRef() 和 Release()。一个特定的对象派生自引用计数对象,但是获取这些对象实例的常用函数 (GetExisting) 将 AddRef() 隐藏在自身内部,而没有宣传它正在这样做。这需要在功能 block 的末尾执行 Release 以释放隐藏的 ref,但是没有检查 GetExisting() 实现的开发人员不会知道这一点,而忘记在末尾添加 Release 的人该函数(例如,在疯狂修复错误的紧要关头)泄漏了对象。这当然是我的烧伤。


void SomeFunction(ProgramStateInfo *P)
{
ThreadClass *thread = ThreadClass::GetExisting( P );
// some code goes here
bool result = UseThreadSomehow(thread);
// some code goes here
thread->Release(); // Need to do this because GetExisting() calls AddRef()
}

所以我编写了一个小类以避免在这些函数末尾需要 Release()。


class ThreadContainer
{
private:
ThreadClass *m_T;
public:
ThreadContainer(Thread *T){ m_T = T; }
~ThreadContainer() { if(m_T) m_T->Release(); }
ThreadClass * Thread() const { return m_T; }
};

所以现在我可以这样做:


void SomeFunction(ProgramStateInfo *P)
{
ThreadContainer ThreadC(ThreadClass::GetExisting( P ));
// some code goes here
bool result = UseThreadSomehow(ThreadC.Thread());
// some code goes here
// Automagic Release() in ThreadC Destructor!!!
}

我不喜欢的是,要访问线程指针,我必须调用ThreadContainer 的一个成员函数Thread()。有没有什么聪明的方法可以清理它,使其在语法上更漂亮,或者类似的东西会掩盖容器的含义并给不熟悉代码的开发人员带来新问题吗?

谢谢。

最佳答案

使用 boost::shared_ptr可以定义您自己的析构函数,例如我们在下一个示例中:http://www.boost.org/doc/libs/1_38_0/libs/smart_ptr/sp_techniques.html#com

关于c++ - Scoped Reference Idiom 的最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/675362/

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