2 stareight StarEight 于 2017.09.02 17:03 提问

以非引用形式返回对象的析构问题
 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函数里的话,不是应该等到程序执行结束才会析构么。

3个回答

caozhy
caozhy   Ds   Rxr 2017.09.02 19:33

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

StarEight
StarEight 你好 请看一下追问
3 个月之前 回复
zxgmlcj
zxgmlcj   2017.09.02 22:41

模拟了一下问题,并没有出现所说的现象。代码如下:
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的再次拷贝。
对于传进来的引用来说,它的作用域范围,是定义它的地方。只有超过
作用域范围,且没有对其引用时,才会释放内存。

StarEight
StarEight 回复zxgmlcj: 你好 请看一下追问
3 个月之前 回复
zxgmlcj
zxgmlcj 直接黏贴代码,连list<string>类型都没了0.0
3 个月之前 回复
StarEight
StarEight   2017.09.07 10:04
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会报错图片说明

zxgmlcj
zxgmlcj 0xDDDDDD的错误,表示currentPtr是个野指针。野指针的产生:释放掉了内存,但是并未设置为NULL,即指针还保留着地址,但地址指向了不确定的位置。导致这个错误的原因:可能是firstPtr已经被释放。为了防止此类错误,C++强烈建议,释放后内存,将指针的值设置为NULL
2 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片