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的专栏”