c++ - 对象的地址可以改变吗?

标签 c++ stdmap

我想使用 std::map (或概率 std::unordered_map )我在其中插入自定义对象键和 double 值,例如std::map<CustomClass,double> . 对象的顺序无关紧要,重要的是(快速)查找。我的想法是插入对象的地址/指针,因为它已经定义了一个比较器,即 std::map<CustomClass*,double>

Pointers as keys in map C++ STL 有人回答说这是可以做到的,但我仍然有点担心可能会有副作用,以后很难发现。

具体来说: 对象的地址可以在程序运行期间更改吗?这会导致我在 map 中查找时出现未定义的行为吗?

测试程序可以是:

auto a = adlib::SymPrimitive();
auto b = adlib::SymPrimitive();

auto c = adlib::mul(a,b);
auto d = adlib::add(c,a);

// adlib::Assignment holds std::map which assigns values to a,b
auto assignment = adlib::Assignment({&a,&b},{4,2});
// a=4, b=2 -> c=8 -> d=12
adlib::assertEqual(d.eval_fcn(assignment), 12);

这是用户代码,因此用户可能会将变量放入 vector 等中。

更新: 这些答案让我想到用户可能会插入 SymPrimitives成一个 vector ,一个简单的场景是:

std::vector<adlib::SymPrimitive> syms{a,b};
auto assignment = adlib::Assignment({&syms[0],&syms[1]},{4,2}); // not allowed

这里的陷阱是 syms[0]a 的拷贝并且有不同的地址。要意识到这一点,我可能会承担用户的责任。

最佳答案

Can the address of an object change during runtime of the program?

没有。对象的地址永远不会改变。

但是,当对象的生命周期结束时,对象可以在创建它的地址处停止存在。

例子:

std::map<CustomClass*,double> map;
{
    CustomClass o;
    map.emplace(&o, 3.14);
}
// the pointer within the map is now dangling; the pointed object does not exist

还要注意一些对come容器的操作会导致容器的元素占用一个新的对象,而旧的被销毁。在这样的操作之后,对这些元素的引用(一般意义上;这包括指针和迭代器)是无效的,并且尝试通过这些引用访问的行为是未定义的。

关于c++ - 对象的地址可以改变吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54747360/

相关文章:

c++ - vmware中的线程编程, 'process scheduling'没有发生

c++ - C++中使用管道实现父子进程通信

c++ - 将标准输出重定向到编辑控件 (Win32)。马克二世

c++ - 如何填充和编辑 map 的std::array

c++ - 如何更新 map C++ 中元素的值

c++ - 通过迭代器打印出 map 的值

c++ - 为什么析构函数调用比构造函数调用多

c++ - 比较 unique_ptr 的映射

c++ - std::map 可以包含对构造函数的引用吗?

c++ - 什么会导致将指针地址写入 std::cout 崩溃?