映射中值类型的地址
Address of value type in map
一般来说,在std::vector<valuetype>
中获取给定值的地址是不安全的,因为如果vector
被重新分配(.resize()
或.push_back()
扩展大小),向量中所有对象的地址可能会改变。
危险:
vector<int> vals ;
vals.push_back( 0 ) ;
int *badP = &vals[0];
vals.push_back( 1 ) ;
// badP could be invalid, if 2nd push_back resulted in realloc
但是,我想知道地图右侧的值类型的安全性。 这安全吗?
危险?
map<int,int> vals ;
vals.insert( make_pair(1,1) ) ;
int *p1 = &vals[1];
// is p1 guaranteed to be valid, as long as the vals[1]
// is not removed, deleted, or changed?
在什么情况下p1
是一个糟糕的指针?
从这里的文档:
http://en.cppreference.com/w/cpp/container/map/insert
将元素插入容器中,如果容器尚未包含具有等效键的元素...。....没有迭代器或引用失效
考虑如何在节点上更改它应该不会影响任何其他节点值。您需要担心的唯一情况是从地图中删除该元素。
要处理这种情况,您可以std::map<int, std::shared_ptr<int>>
。并存储另一个shared_ptr
那么它将非常安全。
编辑:
但是,请注意,如果您基本上尝试创建一个多接口容器,我强烈建议使用 Boost.MuliIndex 库。
http://www.boost.org/doc/libs/1_55_0/libs/multi_index/doc/index.html
相关文章:
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 如何获取C++字符数据类型的地址
- 运行时错误:引用绑定到类型"int"的未对齐地址0xbebebebebebebec6,这需要 4 个字节对齐 (stl_vector.h)
- 堆栈分配的类类型.为什么两个 ID 实例的地址相同?
- 我正在尝试将表的地址传递给要在另一个函数中使用的指针,但得到不兼容的指针类型
- 创建一个函数来转换数组元素的类型并返回数组的地址
- 重载函数的地址与所需类型不匹配
- 对象地址是否保证是其类型对齐的倍数
- 数据对齐:限制内存地址为数据类型大小倍数的原因
- 为什么类型转换对象不会更改其地址?有关对象类型的信息存储在哪里?
- 如何将C++ ulong 4 字节 IP 地址正确转换为 C# 类型
- 加载地址 X 时,对于 Y 类型的对象没有足够的空间
- 我们可以在整数类型的双指针中分配2D整数数组的地址吗?怎么可能
- 通过指向非多态类型的基类的指针获取已分配内存的地址
- 返回类型 char* 的成员函数返回在 while 循环后包含不同字符串的地址
- 自 C++17 年以来,具有正确地址和类型的指针始终是有效的指针
- 使用相同类型的指针传递对象的地址
- 如果 C/C++ 指针是"just"地址,为什么它们需要具有类型?
- 使用函数模板中静态局部变量的地址作为类型标识符是否安全
- 在C/ c++或任何其他类似语言中,对变量或数据类型应用&符号时返回的地址类型