unordered_map迭代器迭代到空指针,无视可能性

时间:2015-10-15 02:50:25

标签: c++ string iterator unordered-map

我在unordered_map中存储了一堆虚拟对象,然后迭代以删除它们。不知何故,它出现了一个键值配对,其中值是一个空指针,即使我很确定这是不可能的。

我制作的每个对象都包含了我随机构建的非常大的字符串的一部分。我确保将该对象的构造函数至少交换为字符串的5个字符。

以下是代码:

删除功能

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());
}

阻止分配对象的位置(在此之前调用delete_objects())

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;
        }
};

课程定义

{{1}}

串行输出,当键为0时,它是SOS(崩溃,对于粒子芯片)

  

关键:194   值:q-&gt; @B {s?tX / miN3K?[~2 [mvTOSKPE34#5 [@ q8 * d8BZwH`

     

删除以下元素:

     

重点:193   值:9Hb ^ 7-J(#z3H#0uqg

     

删除以下元素:

     

重点:192   价值:V $ xZ&gt; C $ u {MjxzxL?{KQqvQp * MN3~Ce&amp; yZbmop1 $ 9xlkJM)jGja~P {mY

     

删除以下元素:

     

重点:191   价值:哟* CVzE~2

     

删除以下元素:

     

重点:190   价值:[&amp; PQakTV3 {^ Aq?(ffV / * 24xaXej)~T1 ^ SfWiM3ATpk#{CoQ

     

删除以下元素:

     

键:0   值

1 个答案:

答案 0 :(得分: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();