c++ STL map::operator[]在被删除的项上执行
c++ STL map::operator[] done on an entry being deleted
std::map<int,int> bar;
int foo(int key)
{
bar.erase(key);
return 1;
}
int main()
{
bar[0] = foo(0);
return 0;
}
此代码使用GCC 4.8 segs编译,当使用electric fence检查内存使用情况时出现错误。
LD_PRELOAD=libefence.so.0.0 ./a.out
问题来自于编译器生成的代码,该代码开始在映射中分配一个新条目,然后执行foo()
以获得要放入bar[0]
的值。当运行foo()
时,条目被销毁,代码最终以在非分配内存中写入结束。
操作的顺序取决于编译器的实现,还是由当前的c++标准指定?
标准(§1.9 15)规定二元操作符的两个操作数的求值是不排序的(除非在某些特殊情况下):
除特别说明外,单个操作符的操作数求值单个表达式的子表达式的和是未排序的。
这意味着它没有强制要求赋值操作的一端在另一端之前求值,实际上,依赖于这些非排序操作的顺序是未定义的行为。
对于函数参数的求值顺序一般也是如此。
你需要把你的任务分成两部分:
int result = foo(0);
bar[0] = result;
相关文章:
- 在构造函数中删除后继续执行
- CMake 添加和删除宏定义以编译共享库/可执行文件
- 为什么删除执行组件指针会导致"Program.exe has triggered a breakpoint"
- 删除单个构造会导致执行不正确
- 为什么在 C++ 执行删除操作后仍可以访问释放的动态分配的内存
- 当删除或删除[]被执行时,计算机会做什么?
- 如何在 VSCODE 中构建、运行和删除可执行文件和虚拟文件
- 当使用三元运算符并删除移动/复制CTOR时,Visual Studio不执行RVO
- 继承类上的运算符new和delete.操作员删除未执行
- 在remove_if删除元素之前,我可以滥用谓词对元素执行操作吗
- QT删除可与Valgrind一起使用,但不能正常执行
- 我们可以通过指向其基类之一的指针来执行删除对象吗?
- C++ 如何执行添加新值并可以删除现有值的循环
- 隐藏或删除不需要的字符串从 Windows 可执行文件版本中
- 从 GCC 可执行文件中删除符号和 RTTI 文本
- 无法从使用 Cmake 创建的可执行文件中删除符号名称
- 在以下代码中执行删除操作时,我无法获得以下代码中返回的正确值
- 对象在执行其成员函数时被删除
- 为什么可执行文件这么大?(为什么没有删除死代码?
- 是否可以使用与 std::set 中包含的不同类型的元素来执行搜索和删除