首页 > Visual C++ > Visual C++的STL和CComPtr的一个问题

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;
    }

在这个函数之前,这里有一个说明,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;
        }
    }

排序的时候要交换元素得值,这里先比较两个元素的地址,是否相同。如果相同,认为是同一个元素,就不交换了。在这里调用&操作符,用于比较元素的地址。这里的元素,就是CComPtr对象。而在这里,对象本身的值,当然不为空,结果就出现了断言失败。

目前没有找到好的解决办法。好在Release版本,不会出现问题。


分类: Visual C++ 标签:
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.

Spam Protection by WP-SpamFree