linux多執行緒中(cmap操作erase的時候產生core!請各位大神幫我解惑

2021-03-27 19:14:38 字數 3367 閱讀 3093

1樓:赫迪夫

這種情況一般是執行緒未同步引起的。

stl不是執行緒安全的,如果你在多個執行緒中同時操作同一個map,你就必須自己進行同步。

2樓:匿名使用者

額...我也遇到了這個問題,要是有答案一定要回答一下我...

3樓:手機使用者

不給**讓別人怎麼幫你分析錯誤啊。既然出錯了顯然是你stl沒有正確使用的結果,你又不給**,你這些gdb資訊只能粗略判斷錯在什麼位置,根本不能判斷是什麼錯誤。

c++ stl map 中erase()後++會指向那個元素?以及erase後map將會自動做什麼操作(也就是會怎麼變動)?

4樓:叫啥才行你說

map的erase()有三個過載函式,你說的是哪個? 如果是根據key值來刪除,成功返回1,失敗返回0.如果根據迭代器刪除單個,迭代器要後++,因為刪除了的迭代器會失效,所以要指向下一個。

如果是根據迭代器刪除一片的話,要重新指定迭代器。

c++ map erase問題

5樓:匿名使用者

erase返回一個空值,這時候iterator存放的值還是被刪除的元素,++後有可能指向被刪除前一個元素,有可能指向被刪除後一個元素。

測試**:

#include

#include

#include

using namespace std;

int main(int argc, char **argv)printf("----%d\n\n", mymap.size());

return 0;}

6樓:匿名使用者

int main()}

c++stl裡面的map.erase(...)

7樓:

你不會是在迴圈裡用erase吧。

這樣的原先的迭代器就失效了。

你說的delete是什麼?

同時erase是返回下一個迭代器。因為要用map stl

for(it = stl.begin(); it != stl.end())

8樓:匿名使用者

崩潰的緣故一般是指標的問題。 如果一個指標指向了未知的地方,而你又呼叫了delete。那麼後果是不可預料的,往往都是崩潰的。

所以,你在清楚的時候,map裡面的成員函式有野指標沒有處理。

c++ 多執行緒讀寫map 怎麼加鎖

9樓:匿名使用者

多執行緒同步機制都是一樣的套路

在寫和讀的時候進行加鎖,用完立馬釋放,不要在鎖過程中進行冗長的操作就行了。

c++ 關於map的begin()與rbegin()

10樓:匿名使用者

map的erase的過載版本之一定義如下:

iterator erase(iterator _where);

它的引數是iterator

而rbegin()的返回值是reverse_iterator,與所需引數不一致,也不能自動轉換版,因此語句不合

權法但是,可以使用erase的另一個過載版本:

size_type erase(const key_type& _key);

此時,語句應該寫成如下的形式:

m.erase(m.rbegin()->first);

這樣就可以成功呼叫了

11樓:匿名使用者

改一下這兩行:

vstr::reverse_iterator i;

for(i=chinese.rbegin();i!=chinese.rend();++i)

我改後就可以執行了。

關於stl map自動解構函式,該怎麼處理

12樓:歐章旭

c++中stl的vector容器的解構函式不用自己呼叫,系統會進行析構,但是vector內元素的清空需要手動進行。

非指標的資料型別,比如 int、string、char ,還包括自定義的資料結構、自定義的類 等等只需要手動呼叫vector的clesr函式就可以了,空間的釋放和析構系統都會自動進行。

指標型別的資料,這種情況需要手動進行釋放。也就是說new 產生的記憶體需要手動使用free進行釋放。

c++ stl中map的問題

13樓:裸跳的螞蚱

你犯了一個錯誤,就是map的[ ]是過載的。比如你寫的map[1],當呼叫這個函式時,它會檢查map中是否有key為1的pair。如果沒有就新增。

所以你使用map[1]這種形式總會有值輸出。另外map使用的並不是陣列,而是紅黑樹。

c++中的erase操作

14樓:匿名使用者

if(isupper(*iter))

問題在這裡 iter = s.erase(iter);

注意std::string 實際上裡面是個動態 char迭代器內部的內容實際是個char*

那麼當erase後 陣列長度發生變化

根據動態陣列的概念 是不是會發生

char* new_p = new char[new_length];

memcpy(new_p, old_p, new_length);

那麼原來的指標還能用嗎??

所以你這個功能應該使用 std::remove_if同樣的 vector也不能使用這樣的操作

但是類似操作 list就可以。

15樓:暖萱紫菱

erase()函式的功能是用來刪除容器中的元素。

函式原型:

iterator erase(iterator where);

iterator erase(iterator first,iterator last);

basic_string& erase(size_type p0=0,size_type n=np);

刪除某個容器裡的某個元素:c.erase(t);

連結串列容器以list為例,執行container.erase(it)。

list::iterator it;

for (it = lt.begin(); it != lt.end(); )

16樓:it孤鶩

試試這個

# include

# include

# include

using namespace std;

int main()

使用多執行緒應注意些什麼,java 多執行緒 需要注意什麼

deadlock 和 race condition c 使用多執行緒處理問題時,應注意什麼?cpu能最多建立的執行緒數,爭取用最少的執行緒達到你想要的效果,如果執行緒建立多了,會增加cpu的負擔,切換時間片浪費過多的時間,就達不到多執行緒的優點了 資源的訪問,也就是執行緒之間的同步和互斥 多執行緒的...

hashmap適用於多執行緒還是單執行緒環境嗎

多執行緒同時訪問資料時,需要互斥訪問。否則訪問的結果不可預期。hashmap為什麼不是執行緒安全的 此實現不是同步的。如果多個執行緒同時訪問一個雜湊映 射,而其中至少一個執行緒從結版構上修改了該映權射,則它必須 保持外部同步。結構上的修改是指新增或刪除一個或多個對映關係的任何操作 僅改變與例項已經包...

hashmap多執行緒為什麼造成死迴圈

一直以來只是知道hashmap是執行緒不安全的,但是到底hashmap為什麼執行緒不安全,多執行緒併發的時候在什麼情況下可能出現問題?hashmap底層是一個entry陣列,當發生hash衝突的時候,hashmap是採用連結串列的方式來解決的,在對應的陣列位置存放連結串列的頭 併發的hashmap為...