![](/img/trans.png)
[英]Can Access Returned LValue Reference after object that allocates it is destroyed
[英]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()
內部創建的iterator
在main
可以看到它之前被銷毀。 main
定義的iter
是一個不同的對象。 它作為第一個的副本開始(但在第一個被銷毀后復制)並作為main
的局部變量超出正常規則的范圍
此代碼不應編譯。 您正在返回對臨時對象的可變引用,這在 C++ 標准下是非法的。
即使它是一個 const 引用,您也將返回對本地的引用,這是未定義的行為。
在這種情況下, return 周圍的括號沒有任何意義。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.