以非引用形式返回对象的析构问题

 template<typename NODETYPE>
/*List<NODETYPE>&*/
void concatenate(List<NODETYPE> &list1, List<NODETYPE> &list2)
{
    NODETYPE value;

    while (!list2.isEmpty())
    {
        if (list2.removeFromFront(value))
            list1.insertAtBack(value);
    }

    //return list1;
}

代码如上,函数作用是把链表2内容附到链表1后面

当我以非引用形式返回main函数里的对象list1时,当concatenate函数调用结束之后list1会被析构。可是 list1在main函数里的话,不是应该等到程序执行结束才会析构么。

局部变量放在堆栈上的话,在函数外析构。

模拟了一下问题,并没有出现所说的现象。代码如下:
list returnStr(list &s2)
{
return s2;
}

int main(int argc, char *argv[])
{
const string s = "24";
list l = {"22","234"};
list s2 = returnStr(l);
getchar();
return 0;
}
解释一下:传递参数传递的是引用类型,而返回参数是对list的再次拷贝。
对于传进来的引用来说,它的作用域范围,是定义它的地方。只有超过
作用域范围,且没有对其引用时,才会释放内存。

template<typename NODETYPE>
List<NODETYPE> concatenate(List<NODETYPE> &list1, List<NODETYPE> &list2)
{
    NODETYPE value;

    while (!list2.isEmpty())
    {
        if (list2.removeFromFront(value))
            list1.insertAtBack(value);
    }

    return list1;
}


int main()
{

    List<int> integerList1;
    testList(integerList1, "integer");

    List<int> integerList2;
    testList(integerList2, "integer");

    concatenate(integerList1, integerList2);
    integerList1.print();

    system("pause");
}

就是这里 main函数最后一个print的时候 如果是以非引用类型返回,print会报错图片说明