Visual C++的STL和CComPtr的一个问题
今天在编写IFilter插件的时候,发现一个STL和CComPtr问题(Visual C++ / Visual Studio 2008):
我定义了一个数组:
std::vector<CComPtr<ICANode> > arrayNodes;
当我对这个数组排序的时候:
std::sort(arrayNodes.begin(), arrayNodes.end(), CompareNodeByID);
出现了一个断言失败,位于atlcomcli.h第149行,如下:
//The assert on operator& usually indicates a bug. If this is really
//what is needed, however, take the address of the p member explicitly.
T** operator&() throw()
{
ATLASSERT(p==NULL);
return &p;
}
//what is needed, however, take the address of the p member explicitly.
T** operator&() throw()
{
ATLASSERT(p==NULL);
return &p;
}
在这个函数之前,这里有一个说明,ATL的作者认为通常来说,对于一个CComPtr对象获得地址,一般是用来给这个对象赋予一个新的值,就像QueryInterface那样。所以,在这个时候,p本身的值,应该是空。
然后经过跟踪,发现是std::sort这里在调用&操作符(<utility>文件):
template<class _Ty> inline
void swap(_Ty& _Left, _Ty& _Right)
{ // exchange values stored at _Left and _Right
if (&_Left != &_Right)
{ // different, worth swapping
_Ty _Tmp = _Left;
_Left = _Right;
_Right = _Tmp;
}
}
void swap(_Ty& _Left, _Ty& _Right)
{ // exchange values stored at _Left and _Right
if (&_Left != &_Right)
{ // different, worth swapping
_Ty _Tmp = _Left;
_Left = _Right;
_Right = _Tmp;
}
}
排序的时候要交换元素得值,这里先比较两个元素的地址,是否相同。如果相同,认为是同一个元素,就不交换了。在这里调用&操作符,用于比较元素的地址。这里的元素,就是CComPtr对象。而在这里,对象本身的值,当然不为空,结果就出现了断言失败。
目前没有找到好的解决办法。好在Release版本,不会出现问题。
分类: Visual C++
最近评论