2012-02-15 86 views
8

觀察Naked Pointers(看第一個回覆),問題很簡單:什麼是裸指針?

什麼是裸指針?

+5

一個真正的指針,而不是一個智能指針。 – ildjarn 2012-02-15 19:00:38

+0

@ildjarn,什麼是智能指針? :) – 2012-02-15 19:01:29

+0

@NickDandoulakis看到talnicolas的評論 – 2012-02-15 19:02:54

回答

10

下面是簡單的例子:

#include <memory> 

struct X { int a,b,c; }; 

int main() 
{ 
    std::shared_ptr<X> sp(new X); 
    X* np = new X; 
    delete np; 
} 

np是指向X類型的對象 - 如果你有動態分配(new/malloc)這個對象,你必須delete/free它...簡單的指針一樣被稱爲「裸指針」

sp是具有指向託管資源,這意味着你可以使用它,就像你會使用np的對象,但在沒有shared_ptr對象擁有這種資源,資源被釋放,所以你不要它不得不delete它。 智能指針照顧內存管理,所以你不必;)

+0

所以裸指針是真正裸露的(即刪除必須強制執行),只有當它是通過新的動態分配的時候 – LivingThing 2012-02-15 19:27:53

+0

@MuhammadSalman:是的,有一個例外:如果你用'a = new int [5];來分配一個數組''你應該像這樣刪除它:'delete [] a;' – LihO 2012-02-15 19:30:43

+0

你應該像分配它們一樣釋放對象,意思是使用'malloc'/'calloc'帶'free','new' w ith'delete'和'new []'用'delete []' – LihO 2012-02-15 19:33:01

8

一個裸指針(原始指針,「啞」指針)是一個C型指針T*。與C++提供的「智能」指針(std::shared_ptr<T>std::weak_ptr<T>std::unique_ptr<T>)進行對比。

12

「裸指針」是一個「普通」指針,即標準和C++中任何一本書的指針指針。這是通常的「T *」(其中T是指針指向的類型)。

「裸」這個術語來對他們反對智能三分球,這是在許多方面表現爲指針類(通常他們超負荷運營商*->在某些情況下[])。

智能指針是「聰明」,因爲他們指定和執行一些所有權的語義,去除裸指針的「啞」:在事實裸指針不指定/知道他們是否自己他們所指的對象(例如,如果在指針超出範圍時它必須被釋放),並且,即使使用某種命名約定,已知如果指向某個指針擁有對象,語言也不會強制執行此操作,因此,如果指針超出範圍和沒有人手動釋放指向的對象(通常這會發生,如果引發異常)您有內存泄漏。

智能指針改爲利用C++類型系統(複製構造函數,賦值運算符,保證調用析構函數,...)的保證來建立和實施某種所有權(通常爲:strict和nontransferable,strict但可以轉移到另一個智能指針,在幾個智能指針之間共享)。

......據說,在StackOverflow和互聯網上有很多關於智能指針的討論,我相信你可以在智能指針上找到更廣泛的討論,以及爲什麼使用裸指針在現代C++程序中,自己的對象通常是壞事TM

4

智能指針是C++的首選方式,因爲它們提供更好的內存管理。智能指針具有額外的信息(計數引用數量,當前所有權等)以及它們指向的對象的地址,因此名稱智能指針和裸指針不包含這樣的額外信息,因此名稱裸指針因此他們不會刪除不再使用的對象,因爲他們沒有這樣的信息。 希望它有助於保留在我們的腦海。