2012-10-23 145 views
0

假設:在這種情況下,我可以重新使用指針嗎?

struct Foo 
{ 
    Obj* pObj; 
    Foo() : pObj(NULL); 
}; 

Obj* CreateObj() 
{ 
    //do some stuff and then 
    return new Obj; //obj is a class 
} 

int main() 
{ 
    Foo foo; 
    foo.pObj = CreateObj(); 
    DoSomeOperationWithTheObj(foo.pObj); 
    //suppose foo is a monster that should be 'killed' or deleted now 
    delete foo.pObj; 
    foo.pObj = NULL; 
    //the question is can this pointer be 're-used' now like this: 
    foo.pObj = CreateObj(); //create another object 
} 

由於指針被刪除,是不是有問題,再次使用它嗎?

+4

不要將指針與它「指向」的對象混淆。 – 2012-10-23 05:15:00

+0

@pst你的意思是我應該做'delete * foo.pOBj'? –

+6

是的,您可以將指針重新分配給新的/不同的對象 – mac

回答

3

至於你的原始問題:是的,你可以重新指派這樣的指針。一個指針只保存一個內存地址,僅此而已。

但是你不應該這樣做,因爲像這樣處理原始指針會導致錯誤,你已經有一些在你的代碼中。現代C++可以讓你做到這一點更好,不用擔心。假設我們從這裏(編譯)代碼開始,我取代的OBJ由一個int,但事實證明這是一個原生型的,而不是一類並不重要:

#include <iostream> 

struct Foo 
{ 
    int* pObj; 
    Foo() : pObj(NULL) {} 
}; 

int* CreateObj() 
{ 
    return new int(42); //obj is a class 
} 

int main() 
{ 
    Foo foo; 
    foo.pObj = CreateObj(); 
    std::cout << *foo.pObj << std::endl; 
    delete foo.pObj; 
    foo.pObj = new int(13); 
    std::cout << *foo.pObj << std::endl; 
    delete foo.pObj; 
} 

我們可以將此轉換爲以下幾點:

#include <iostream> 
#include <memory> 

struct Foo 
{ 
    std::unique_ptr<int> pObj; 
    Foo() : pObj(NULL) {} 
}; 

std::unique_ptr<int> CreateObj() 
{ 
    return std::unique_ptr<int>(new int(42)); 
} 

int main() 
{ 
    Foo foo; 
    foo.pObj = CreateObj(); 
    std::cout << *foo.pObj << std::endl; 
    foo.pObj = std::unique_ptr<int>(new int(13)); 
    std::cout << *foo.pObj << std::endl; 
} 

指出,主要的變化是,我刪除了原指針和與unique_ptr包裝取代了它們。這有幾個優點:

  1. 您明確聲明所有權,unique_ptr只能由當前範圍擁有。 createObj創建對象時,通過返回臨時(無名稱)unique_ptr它釋放所有權,以便調用方可以隨時刪除它。這將避免棘手的memleaks。
  2. unique_ptr超出範圍或被覆蓋時(例如,由賦值運算符),刪除會自動發生。
+0

我希望我能不止一次地對此讚不絕口 –

1

是的,你可以重新使用指針。指針只是引用對象的一種方式。由於您刪除了該對象,因此您可以隨意使用該指針來滿足您的任何需要。

1

這樣做肯定沒有問題。指針只是地址的容器(類似於包含值的變量)。

new分配一個對象並返回一個地址給它。然後,您可以將結果地址分配給所需的任何指針(具有適當的類型),無論它是否爲delete d指針,保存「現有」已分配對象的指針,NULL保持指針還是未初始化的指針。

0

只要先前分配的內存先被釋放,就像您在代碼中已經做過的那樣,重用指針沒有問題。

當你delete一個指針,你實際上釋放它指向的內存。指針(內存的起始地址)的值不變,直到您pointer = NULLpointer = new ..

0

重新分配它可以重複使用指針,因爲你永遠不會被刪除的指針;你刪除了指針指向的Obj。請記住,指針正在存儲內存地址。所以,就像你可以將一個int改爲一個不同的值一樣,你總是可以改變一個指針來記住或指向不同的內存地址。此外,當您在foo.pObj上執行刪除操作時,您並不是說「刪除foo.pObj」。相反,你會說「刪除foo.pObj指向的Obj」。

如果您在執行delete操作後嘗試對foo.pObj指向的對象執行某些操作,則會出現問題。

相關問題