2010-09-24 77 views
-4

對不起,我不能提供代碼BC我沒有它。C++ std ::向量擦除元素0拋出異常

我的同事(曾與該公司長期合作,但似乎並不知道自己在做什麼)聲稱他必須做一些奇怪的事情來清除媒介中的元素。他將所有元素移動到某個位置(從他想移除的元素開始),然後移除向量中的最後一個元素。這聽起來不錯,但效率很低。標準庫的std :: vector :: erase()應該能夠處理這個問題。

他這樣做是因爲他聲稱在元素0上調用擦除會給出隨機異常。

我的問題是什麼可能導致這種情況?我很確定這是一個線程安全問題,但是還有什麼可能導致它的?

請讓我知道...我是C++新手。

再次,抱歉無法提供代碼。

感謝, JBU

+4

沒有看到代碼,答案是,「代碼中的任何內容都可能是錯誤的。」從同事處獲取代碼並通讀它;調試它,並查看它失敗的原因;如果您對某些代碼有特定問題,請隨時在此發佈代碼,毫無疑問,有人可以幫助解釋它。 – 2010-09-24 17:25:00

+0

@JamesMcNellis好的問題是,他改變了代碼...因爲它是「不工作」 – jbu 2010-09-24 17:25:26

+1

@jbu - 你到底想要什麼?如果你想修復,獲取代碼併發布。代碼破解的方式有很多種,對任何人來說都不是一種有效的猜測。 – 2010-09-24 17:28:44

回答

5

...調用刪除元素0上給出了隨機例外。

不,它不。

這就是你可以期待的所有答案,沒有關於他在做什麼的更多信息。

2

在元素零上調用erase將拋出異常的唯一地方就是未定義的行爲已被調用的情況。最常見的情況是,試圖從空向量中清除零元素。

這聽起來不錯,但效率很低。

不是真的 - 這就是erase正在做的事情。但是重新實現標準庫已經爲你做的事情是沒有意義的。

+1

由於(std :: vector :: erase)的標準版本需要使用迭代器,因此也可能對已使現有迭代器無效的向量執行了操作。 – jamesdlin 2010-09-24 18:10:25

1

沒有代碼,很難說。如果vector::size()> 0,那麼擦除元素0是完全有效的。這可能是他使用迭代器來清除第0個元素,並且迭代器以某種方式失效。

0

根據你對同事邏輯的描述,我會說你的評價是準確的。 '隨機異常'='由於誤用矢量容器而導致的未確診錯誤'。

這就是說,這個問題有點沒有意義 - 如果你不能提供資料來源,你怎麼能得到一個明確的答案,什麼是錯的或以其他方式?