2014-05-07 56 views
0

所以我寫了一段代碼,我用new運算符在本地作用域函數內創建一個對象,並將引用作爲指針返回。C++ new operator scope

A* operator+(A that){ 
    int sumA = a + that.getA(); 
    int sumB = b + that.getB(); 
    return new A(sumA, sumB); 
} 

在我認爲這是行不通的,因爲對象是局部範圍內產生,應該是暫時的,但它編譯和運行。任何人都可以向我解釋這個嗎?我相信還有其他的東西有能力打破範圍和東西。如果可能的話,你能給我一些例子嗎?不勝感激!

+0

[我應該什麼時候在C++中使用new關鍵字?](http://stackoverflow.com/questions/655065/when-should-i-use-the-new-keyword-in-c) – aruisdante

+1

@aruisdante這個問題如何與你鏈接的那個重複? OP詢問爲什麼指針可以被返回,而不會將對象指向「超出範圍」。 – yjwong

+0

@yjwong因爲它顯示了對「新」功能的明確誤解。鏈接的副本解釋。如果OP瞭解「新」做了什麼,這個問題就不會被問到(或者更確切地說,會問到一個非常不同的問題)。 – aruisdante

回答

4

當你說「在本地範圍內創建」時,你的真正意思是「自動變量」。自動變量在其創建範圍退出時自動銷燬。

new不會創建自動變量。它創建一個動態分配的對象,其生命週期不受其創建的範圍的約束。

創建的對象,new A(sumA, sumB)不是臨時的

0

值總是從本地範圍返回。例如:

int f(int x) 
{ 
    int y = x*x; 
    return y; 
} 

雖然一個變量在超出範圍時通常會消失,但函數返回的值會得到編譯器的特殊處理。

關於你的例子,你正在堆上創建一個對象,並且在本地堆棧上有一個指向該對象的指針。當你的函數返回時,堆棧被清理乾淨,該指針隨之一起被清理。除了 - 因爲你要返回指向調用者的指針,指針的副本會傳回給調用者(可能通過一個cpu寄存器)。另外:雖然這很好,但你需要確定調用者最終刪除了返回的對象,否則你會有內存泄漏。

+0

所以這個對象基本上不是用範圍創建的嗎?因爲即使我們已經離開函數範圍,我們仍然可以通過指針訪問對象。 – user3513507

+0

沒錯,對象是在堆上創建的。儘管如此,指向它的指針仍然可能超出範圍,例如,如果沒有返回它,或者調用者忽略返回值,可能會發生。 – jaket

0

C++不會自動爲您管理內存。這意味着您必須手動'刪除'用'new'操作符動態創建的任何對象。你的代碼是有效的,但我認爲它沒有達到你想要的。我認爲你正在尋找的東西是這樣的:

A operator+(const A& that){ 
    int sumA = a + that.getA(); 
    int sumB = b + that.getB(); 
    return A(sumA, sumB); 
} 
0

是的,new創造的價值將仍然活着的函數退出之後。

正如其他人所提到的,這些對象需要delete以避免內存泄漏。因此,最好的一般C++實踐是不返回像這個函數那樣的裸指針,而是返回某種類型的智能指針對象,如shared_ptr。這樣,您可以返回一個指向新創建對象的指針,並且一旦沒有更多的活動引用對象,該對象將自動銷燬。

相關問題