2010-04-18 62 views
1

我有一個類的對象指針向量。我已經在這個矢量中引入了一些元素,並且在我的主文件中,我設法打印它們並添加沒有問題的其他元素。現在我試圖從該向量中移除一個元素,並檢查它是否不是NULL,但它不起作用。指向對象的C++麻煩

我是在類測試加油吧:

Other *a = new Other(1,1); 
Other *b = new Other(2,2); 
Other *c = new Other(3,3); 

v->push_back(a); 
v->push_back(b); 
v->push_back(c); 

而且在我的主文件我有:

Test t; 
(...) 

Other *pointer = t.vect->at(0); 

delete t.vect->at(0); 
t.vect->erase(t.vect->begin()); 

if (pointer == NULL) { cout << "Nothing here.."; } // Never enters here.. 
+0

你只需要設置在刪除它之後立即指向NULL。它可能看起來多餘,但事實並非如此。刪除釋放內存,將其設置爲NULL讓你檢查它是否已被刪除。 – zxcvbnm 2010-04-18 01:07:43

+0

@zxcvbnm:這是一個很好的做法,但在這種情況下不起作用。 Zibd有兩個指向同一個對象的指針;使用其中一個刪除該對象,然後將其設置爲NULL仍然使其他指向釋放的內存。 – Beta 2010-04-18 03:15:21

回答

2

的內存由指針指向的缺失,不設置指向NULL的指針。

4

刪除一個指針不必將它歸零,它只是釋放分配給它的內存。使用pointer在刪除後未定義,因爲內存可以自由用於其他事情。從技術上講,C++規範故意將它留給實現,無論他們是否想要零刪除指針,但幾乎沒有我知道這樣做

+0

沒錯。在這種情況下,有什麼辦法可以做我假裝的東西? – dmessf 2010-04-18 00:48:40

+0

我不確定你想要做什麼,檢查的重點是什麼? – 2010-04-18 00:51:12

+0

無論如何請注意,矢量中的指針被刪除,但是它是一個完全不同的被複選的相同地址的副本。沒有辦法,C++運行庫會搜索你的整個程序的每一個地址副本,並將它們全部設置爲null。 – 2010-04-18 02:19:05

1

您設置的指針等於某個地址,並且再也不會觸及它,所以當然它不會爲空。事實上,你然後做了對象的事情是無關緊要的。

使用簡單的指針,指針沒有安全的方法來確定它曾經指向的對象是否已被刪除。做你想做的事情最簡單的方法是把它留給容器:如果你對這個對象感興趣,在vector中搜索指針,看看它是否仍然存在(並且不要刪除沒有的對象擦除矢量中的相應元素,否則您將再次遇到同樣的問題)。

0

要克服檢查已刪除的ptr問題,您可以使用boost::shared_ptr

相反刪除使用.reset()和檢查,如果PTR仍然有效使用.get()
(其實你也可以只使用if(p)其中p爲shared_ptr的,因爲它有一個轉換到bool)