2012-04-23 162 views
0

返回值之前,如果我有這樣的:刪除指針從功能

double foo() 
{ 
double* ptr = new double(0); 

return *ptr; 
} 

若ptr沒有返回之前被刪除,這將導致內存泄漏?因此,在從函數返回之前刪除ptr的正確方法是什麼?

+0

是的,這會導致內存泄漏,但是,它似乎是一個壞的例子......無需分配新的內存只是爲了有一個雙。 – Kiril 2012-04-23 16:55:45

+0

我會建議:void foo(double * d);並傳入指針,您可以將該值指定到函數內部,然後管理內存。 – Inisheer 2012-04-23 16:57:27

回答

7

您有幾種解決方案:

  • scoped_ptr的
  • 堆棧
+0

如果'scoped_ptr'不可用,'auto_ptr'會在一個捏。這是一個不會導致任何問題的用例。 – 2012-04-23 16:55:15

+1

如果'unique_ptr'不可用,則只使用'scoped_ptr'或'auto_ptr'。 – 2012-04-23 17:24:04

4

如果你不希望對象(而不是它的值)存在超出上聲明一個變量函數的範圍,那麼動態分配它就沒什麼意義了。

只是爲它分配堆棧:

double foo() { 
    double d = 0; 

    ... 

    return d; 
} 

另一種方法是讓物體存在超越函數的範圍,在這種情況下,你不希望在返回前將其刪除。管理這個最好的方法是使用某種智能指針(這在大多數情況下會自動處理內存管理)。

0

如果您要返回ptr指向的值,那麼您絕對要做而不是想要在離開函數之前將其刪除。如果你刪除它然後返回它,調用函數將嘗試訪問已釋放的內存,並且這是被禁止的。

+0

他在返回之前取消引用指針,所以他正在獲取值。請注意,返回類型是'double'而不是'double *'。 – Kiril 2012-04-23 16:57:19

0

只要你在你調用函數的同一個類的指針中收到foo()的返回值就可以。之後,您可以在不再需要該指針時使用刪除...

0

爲什麼要動態分配雙精度?我想不出任何 上下文哪裏new double將是合理的。只需聲明double 作爲局部變量。

關於您唯一想要分配一個對象的情況下,如果涉及到多態性 ,則該對象的生命週期將在函數結束時結束。在這些情況下,您可以使用std::auto_ptr(或 std::unique_ptr如果您確定所有編譯器您將會看到 將支持C++ 11)。