2015-10-15 206 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();