下面的代码是ms库中的一段代码: 
我有个问题很困惑: 该方法返回一个智能指针,但该智能指针指向的对象是局部的,也就是说,该方法返回时,_result应该被释放!
由此导致一个问题: 返回值很可能是不确定的(如果该地址未被覆盖,返回值应该是希望的值:指向_result原来所在地址的智能指针,但这个不能保证)
大家解释一下这种写法把.
真的看不明白.....inline IXMLDOMNodePtr IXMLDOMNode::selectSingleNode ( _bstr_t queryString ) {
    struct IXMLDOMNode * _result = 0;
    HRESULT _hr = raw_selectSingleNode(queryString, &_result);
    if (FAILED(_hr)) _com_issue_errorex(_hr, this, __uuidof(this));
    return IXMLDOMNodePtr(_result, false);   //_result会被释放 !!!!
   

解决方案 »

  1.   

    struct IXMLDOMNode * _result = 0; //声明了一个指针
        HRESULT _hr = raw_selectSingleNode(queryString, &_result); //函数里,为_result分配地址,并赋值
    return IXMLDOMNodePtr(_result, false);   //_result是堆上的,不会释放
      

  2.   

    栈指针变量会被释放,但是指针指向的内存不会被释放,这个内存由IXMLDOMNodePtr(_result,false)这个临时智能指针接管了,将在外部调用语句结束时被析构,被析构时会调用接口的Release操作,所以无需担心任何内存无效或内存泄露的问题。
      

  3.   

    1L和2L都解释的挺清楚的,内存分配分为两块,堆和栈,堆是动态内存区,不会主动释放,而栈在函数返回时则会被主动释放,局部变量均是在栈中分配的,但是像malloc以及new则是在堆中分配的,故返回时不会被释放,需要你自己调用析构函数释放.
      

  4.   

     return IXMLDOMNodePtr(_result, false);   //_result会被释放 !!!!
    当我们说指针时,我们关心的是指针变量的值,而不是指针变量自身
    _result自己当然是在栈上因此会被释放,但是,这里只要它指向的COM对象地址,也就是它的值,它自己释放与否,对系统不会造成任何问题