簡體   English   中英

當引用返回的對象被銷毀時?

[英]When a object returned by reference is destroyed?

考慮這兩個類( List<Type>List<Type>::iterator

// List<Type>
template<typename Type>
class List {
public:
    class iterator;
    iterator& iter();

private:
    Type *elems; // Array
};

// List<type>::iterator
template<typename Type>
class List<Type>::iterator {
public:
    Type *current;
    Type operator* ();

private:
    iterator (Type *current) : current(current) {}
};

template<typename Type>
typename List<Type>::iterator& List<Type>::iter () {
    return (iterator(this->elems));
}

// Program
int main () {
    List<int> *list = new List<int>();
    List<int>::iterator iter = list->iter(); // When does iter get destroyed?
    delete list;
}

我用括號return (...); 可以這么說,作為引用返回。 我不確定,但我認為iter是在堆棧上創建的(因為沒有new )。 所以我的問題是: iter時候超出范圍? iter()之后,在main()還是其他地方? 我必須手動delete它嗎?

您返回了對臨時對象的引用,因此在調用者甚至可以訪問該引用之前它就被銷毀了(您有未定義的行為)。

你讀了什么(在哪里)關於“帶括號返回”的內容? 據我了解,當編譯器必須推斷返回類型時,這會產生重要的不同。 但是您指定了返回類型,因此這些括號應該沒有區別。 如果你讀到的東西與此不同,你在哪里讀到了什么?

重讀時,我認為您混淆了兩個不同的對象。 iter()內部創建的iteratormain可以看到它之前被銷毀。 main定義的iter是一個不同的對象。 它作為第一個的副本開始(但在第一個被銷毀后復制)並作為main的局部變量超出正常規則的范圍

此代碼不應編譯。 您正在返回對臨時對象的可變引用,這在 C++ 標准下是非法的。

即使它是一個 const 引用,您也將返回對本地的引用,這是未定義的行為。

在這種情況下, return 周圍的括號沒有任何意義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM