虽然学程序都3年了,可是本人的基本功有的时候自己都怀疑。以前只听说过智能指针但一直没有用过。该来的总该回来躲是躲不掉的。到底让我碰上了。
这两天一直在学读写xml。为了简单当然得站在巨人的肩膀上了,所以我用的是很普遍的MS XML读取。废一句话刚开始写了一点程序还没成型所以现在还不想写出来丢人。今天只写一下智能指针的问题。
MSXML2::IXMLDOMDocument docPtr;
就是这个家伙使用完了退出程序总是报错。所以按照以前的方法:
if (docPtr != NULL)
{
docPtr->Release();
docPtr = NULL;
}
居然不行!!着实郁闷!!老经验:“你遇到的问题别人都遇到过,上网搜!”。终于黄天不负我程序有心人啊,问题终于找到并解决了。所以赶紧在这里记下一笔。
智能指针不用我们Release(),在赋值时也不用我们先判断原指针是否有效,然后Release(),然后再AddRef()等等一连串麻烦的调用....局部智能指针在函数结束时,会自动调用虚构函数以调用Release()。
当在一个类中中把智能指针作为类的数据成员。然后在一个类成员函数中调用::CoInitialize()初始化COM库,并初始化作为类的数据成员的智能指针。这就涉及另一个函数:::CoUninitialize()了。这个函数在什么时机调用比较好?当然是所有智能指针都释放了后再调用。但作为一个类的数据成员,如果这个数据成员本身也是一个类时,比如智能指针,会在这个类的虚构函数调用结束后再调用数据成员的虚构函数。这个问题又回到了刚才在一个函数使用智能指针的问题,也即一个范围的问题。
{
docPtr->Release();
}
{
docPtr->Release();
docPtr = NULL;
}
{
docPtr = NULL;
}