C++中调用成员函数是否会实际访问对象及成员指针内存?
问题解答
第一个问题:调用my_class_ptr->func();时,解引用my_class_ptr是否会访问my_class的内存?
会。非虚成员函数是静态绑定的,my_class_ptr->func()本质等价于把my_class_ptr作为this指针传递给MyClassWrapper::func(),而func()内部要访问MyClassWrapper的私有成员obj_,这就必须读取my_class对象内存中obj_字段的位置。整个调用过程必然会访问my_class的内存地址。
第二个问题:MyClassWrapper::func()中调用obj_->func();时,是否会访问obj_字段本身的内存?
会。obj_是std::unique_ptr<MyClass>类型,要调用它指向的MyClass对象的func(),首先得读取obj_本身存储的内存地址值(也就是它指向的MyClass对象的位置),这个读取操作就是访问obj_字段的内存。
关于容器线程安全的结论
如果容器(比如std::vector)存放MyClassWrapper对象,当其他线程添加元素时,部分容器(如vector)可能因扩容重新分配内存,导致原有对象的内存地址失效、对象被移动或销毁。而当前线程调用func()时正处于访问MyClassWrapper对象内存的过程中,不同步的话会触发未定义行为。因此必须阻止其他线程在访问容器内对象内存时执行添加元素的操作,需要用互斥锁等同步机制保证线程安全。
内容的提问来源于stack exchange,提问作者user15955526
相关产品推荐
相关产品推荐

