我在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 值
答案 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();