设为首页 加入收藏

TOP

有效的使用和设计COM智能指针――条款13(二)
2014-11-23 23:11:49 来源: 作者: 【 】 浏览:6
Tags:有效 使用 设计 COM 智能 指针 条款
urn m_pArray[--m_nTop];
}
MyStack(const MyStack& otherArray)
{
//deep copy it
};
private:
T *m_pArray;
int m_nTop;
int m_nCapacity;
};

而使用这个MyStack的过程是如下这样的:

view plaincopy to clipboardprint MyStack> g_myStack(1000);
void func()
{
for (int i=0; i<500; i++)
{
CComPtr spCalculator = NULL;
spCalculator.CoCreateInstance(CLSID_CALCULATOR);
g_myStack.push(spCalculator);
}

...

for (int i=0; i<500; i++)
{
CComPtr spCalculator = g_myStack.pop();
spCalculator->DoSomething();
}
}
MyStack> g_myStack(1000);
void func()
{
for (int i=0; i<500; i++)
{
CComPtr spCalculator = NULL;
spCalculator.CoCreateInstance(CLSID_CALCULATOR);
g_myStack.push(spCalculator);
}

...

for (int i=0; i<500; i++)
{
CComPtr spCalculator = g_myStack.pop();
spCalculator->DoSomething();
}
}
500个CoCreateInstance()这个操作或许会让你觉得有点疯狂。但我仅仅是想让你知道内存泄漏是如何潜在的发生的。

其原因是什么? 智能指针无法在这种情况下自动帮我们释放掉相应的资源,首先他在全局空间上。如果想等待~MyStack()这个析构函数被调用可能需要等到程序结束。而在pop后我们不应当继续在MyStack中保存智能指针对接口的引用。试想,若之后这个MyStack中的元素永远达不到500个。那么,MyStack后半部分所持有的资源永远无法被释放掉。

因此必须手动释放COM组件时,别妄想智能指针帮你完成,稍微改写一下pop()函数,资源泄漏问题解决了。

view plaincopy to clipboardprint template
class MyStack
{
public:
....
T pop(){
assert(m_nTop > 0);
T tempArray = m_pArray[--m_nTop];
m_pArray = NULL; //或者用 m_pArray.Release();
return tempArray;
}
private:
....
};
template
class MyStack
{
public:
....
T pop(){
assert(m_nTop > 0);
T tempArray = m_pArray[--m_nTop];
m_pArray = NULL; //或者用 m_pArray.Release();
return tempArray;
}
private:
....
};


谨记在心,智能指针只是辅助我们管理内存的手段。必须提前释放COM资源时,别妄想智能指针帮你完成。这一节可以结束了。

作者“liuchang5的专栏”

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇有效的使用和设计COM智能指针――.. 下一篇华为一道机试题-操作系统任务调度..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: