无堆与指针场景下C++对象赋值操作属于浅拷贝还是深拷贝咨询
问题对应的代码段
class A{ public: int val; a(); }; int main(){ A obj1; A obj2=obj1; }
结论
你示例中的A obj2=obj1执行的是浅拷贝,但当前场景下浅拷贝和深拷贝的运行效果没有任何差异。
详细解释
- 首先要明确:深浅拷贝的差异只在类包含指向堆内存的指针成员时才会体现:
- 浅拷贝仅逐位复制对象的所有成员值,如果有指针成员,两个对象的指针会指向同一块堆内存,销毁时容易出现double free、野指针等问题
- 深拷贝会额外申请独立的堆内存,把原指针指向的内容完整复制到新内存中,两个对象的指针指向不同内存,互不干扰
- 你提供的类A仅包含
int类型的成员,没有指针也没有堆内存占用,编译器默认生成的拷贝构造函数只会把obj1.val的值直接复制给obj2.val,本身就是浅拷贝行为,也不会产生任何运行问题。
关于你提到的地址不同的问题
obj1和obj2是栈上两个完全独立的对象,本身就占用两块不同的内存空间,用addressof()拿到的对象本身的地址当然不一样,这个和深浅拷贝没有任何关联。深浅拷贝判断的从来都不是对象自身的地址,而是对象内部的指针成员指向的堆内存地址是否相同。
内容的提问来源于stack exchange,提问作者Bill Indie
相关产品推荐
相关产品推荐

