2012-08-07 134 views
2

只是想知道這是否是一個不好的做法。傳遞新對象到函數C++

for(int i=0;i<1000;i++) 
    happyFunction(new Car()); 

新車()對象的生活應當不受happyFunction調用它後,以後應該摧毀 現在是確定的事情。我的意思是我不應該刪除爲該實例分配的內存?

示例使其更加清晰。

int i = 0; 
for (i=0;i<1000;i++){ 
new car(); 
} 

這是一個很好的做法嗎?我應該刪除內存分配嗎? 我希望我的問題很清楚。 謝謝。

+8

你應該更好地閱讀一些C++的書[在C++中,爲什麼要'new'的 – Andrew 2012-08-07 11:23:39

+1

可能重複儘可能少使用?](http://stackoverflow.com/questions/6500313/in-c-why-should-new-be-used-as-little-as-possible) – KillianDS 2012-08-07 11:25:34

+0

嗯,我想你需要更具體一點。我說一般來說這是不好的做法,但有時你可以在方便時做到這一點,無所謂。 – ygram 2012-08-07 11:29:28

回答

7
happyFunction(new Car()); 

在自己的實踐中(雖然幾乎肯定是錯誤的),內存可以在函數內部刪除。但那會讓人困惑,所以它不是最好的主意。

而且雖然它是安全的一個參數,如果是這樣的

happyFunction(new Car(), new Thing()); 

和消息一個接着拋出異常其他新執行時,就沒有辦法來釋放內存,所以它不是安全。

你總是不得不自己用C++釋放內存,所以你的第二個例子會導致大的內存泄漏。有類如的unique_ptr和shared_ptr的來幫助你管理它,而無需編寫自己刪除,你可以找到任何數量的教程在網上對他們

2

有兩種可能性:

  1. happyFunction應該取得指針的所有權,並且調用者從不擔心它。在這種情況下,這將是更明智寫

    void happyFunction(std::unique_ptr<Car> &&car) 
    { 
        // car is mine now, and is automatically destroyed when I return 
        // unless I explicitly request otherwise 
    } 
    
    void caller() 
    { 
        happyFunction(std::unique_ptr<Car>(new Car)); 
        // the new Car is immediately handed over to the unique_ptr 
        // and I don't have to worry about leaks 
    } 
    
  2. happyFunction情況應該只是一個使用指針:主叫方保留控制和所有權。在這種情況下,這將是更好地傳遞一個參考,所以沒有建議,所有權轉移

    void happyFunction(Car &car) 
    { 
        // car is still owned by the caller, 
        // I just get a reference to use in here 
    } 
    
    void automatic_caller() 
    { 
        Car car; 
        happyFunction(car); 
        // car is always owned by me, and is 
        // automatically destroyed at the end of this scope 
    } 
    
    // alternatively (only if car should live longer than the enclosing scope) 
    void dynamic_caller() 
    { 
        std::unique_ptr<Car> car(new Car); 
        // or get pointer from somewhere else ... 
        // or get shared_pointer, etc. etc. 
        happyFunction(*car); 
        // again car is destroyed here unless we do something special 
    } 
    
+0

我意識到這有點舊,但我想問一下調用者是否仍然可以保留已分配對象的所有權,如果以OP描述的方式調用它的話。也就是說,如果他使用'happyFunction(new Car());',調用者仍然可以'刪除'它嗎?我問,因爲你說'在#2中傳遞參考'會更好,這意味着存在替代(可能是原始方法)。 – Hydronium 2013-03-15 14:41:10

+0

在你的例子中,調用者沒有_have_指向對象的指針(因爲它從不將'new'的結果賦值給一個變量,它只發送給函數調用)。所以,調用者沒有辦法刪除該對象。 – Useless 2013-03-15 17:36:24

+0

......這似乎很危險。編譯器/ C++標準允許這樣做是有原因的,因爲它看起來應該是永遠不應該做的事情? – Hydronium 2013-03-15 17:38:01