2015-10-15 118 views
0

我在unordered_map中存儲了一堆虛擬對象,然後遍歷並刪除它們。不知何故,它出現了一個鍵值對,其中的值是一個空指針,即使我很確定這是不可能的。unordered_map迭代器迭代爲空指針,違反可能性

我製作的每個對象都只是我隨機構造的一個非常大的字符串的一部分。我一定要把這個對象的構造函數至少交給字符串的5個字符。

下面是代碼:

刪除函數,其中對象被分配

bool delete_objects(){ 
    Serial.println("deleting objects in 'store'"); 
    for(auto iter = store.begin(); iter != store.end(); iter++) 
    { 
     Serial.println("\nDeleting the following element: \n"); 
     Serial.print("Key: "); 
     Serial.println(iter->first); 
     delay(1000); 
     Serial.print("Value: "); 
     Serial.println(iter->second->ShowMeWhatYouGot()); 
     delay(1000); 

     delete iter->second; 
     iter->second = nullptr; 
     store.erase(iter); 
    } 

    if(store.empty()) 
     return true; 
    else 
     return false; 
} 

塊(delete_objects()被此之前右稱爲)

unsigned int index = 0; 
unsigned int key = 0; 
while(index < buff_string.length()){ 
    int amount = (rand() % 51) + 5; 
    DummyClass* dc = new DummyClass(buff_string.substr(index, amount)); 
    store[key] = dc; 
    index += amount; 
    key++; 
    Serial.println("Created new DummyClass object"); 
    Serial.print("Free Memory: "); 
    Serial.println(System.freeMemory()); 
} 

類定義

using namespace std; 

class DummyClass { 
    private: 
     char* _container; 

    public: 
     DummyClass(){ 
     } 

     DummyClass(string input){ 
      _container = new char[input.length()]; 
      strcpy(_container, input.c_str()); 
     } 

     ~DummyClass(){ 
      delete _container; 
      _container = nullptr; 
     } 

     char* ShowMeWhatYouGot(){ 
      return _container; 
     } 
}; 

串行輸出,它SOS的(崩潰,對於粒子芯片)時密鑰是0

鍵:194 值:Q - > @乙{S TX/miN3K? [〜2 [mvTOSKPE34#5 [@ Q8 * d8BZwH`

刪除以下元件:

鍵:193 值:9HB^7-J(#z3H#0uqg

刪除以下元件:

鍵:192 值:V $ XZ> C $∪{MjxzxL {KQqvQp * MN3〜Ce的& yZbmop1 $ 9xlkJM)jGja〜p {我

刪除?以下元件:

鍵:191 值:喲* CVzE〜2

刪除以下元件:

鍵:190 值:[& PQakTV3 {^ AQ(FFV/* 24xaXej?]〜T1^SfWiM3ATpk#{的CoQ

刪除以下元件:

鍵:0 值

+0

的可能的複製[會發生什麼,如果你的地圖元素調用擦除(),而從迭代開始結束?](http://stackoverflow.com/questions/263945/what-happens-if-you-call-erase-on-a-map-element-while-iterating-from-begin-to) – Basilevs

回答

2

http://en.cppreference.com/w/cpp/container/unordered_map/erase

被擦除元素的引用和迭代器將失效。其他迭代器和引用不會失效。

store.erase(iter); 

iter是無效的。之後的表達式++iter會導致未定義的行爲。

for(auto iter = store.begin(); iter != store.end(); /* iter++ */) 
                // Not needed 
{ 
    // code 
    // ... 

    iter = store.erase(iter); 
} 

另一種方式來解決這個問題:解決問題

一種方式

for(auto iter = store.begin(); iter != store.end(); iter++) 
{ 
    // code 
    // ... 

    // Dont' call erase. 
    // store.erase(iter); 
} 

// Clear the map. 
store.clear();