C++构造器中数组指针赋值有效性及拷贝机制的技术问询
问题解答
第一个问题:构造器代码输出true不是侥幸
你这段代码里,arr是main函数里的局部变量,它的生命周期和vec完全重叠——只要main函数没执行完,arr占用的内存就不会被释放。所以vec.data_ptr指向的arr的地址是有效的,访问vec.data_ptr[0]自然能拿到正确的值,和arr[0]相等是必然的,不是侥幸。
但要注意,这种写法隐患极大:如果把arr放到其他函数里(比如一个创建数组并返回Vector3d的函数),当那个函数执行完毕,局部数组的内存会被回收,此时vec.data_ptr就变成了悬空指针,再访问就会触发未定义行为(可能崩溃、输出错误值等)。你之前了解的“返回方法内数组的指针会失效”,指的就是这种局部数组生命周期结束的场景。
第二个问题:数组成员的拷贝构造是独立值,内存地址不同
当你把成员变量改成float data_ptr[3]时,这个数组是Vector3d对象的一部分,拥有独立的内存空间。构造器里的循环把values数组的每个元素值复制到data_ptr对应的位置,所以:
data_ptr[i]和values[i]是存储在不同内存地址的独立值- 修改其中一个不会影响另一个(比如修改
arr[0],vec.data_ptr[0]不会跟着变)
内容的提问来源于stack exchange,提问作者rocksNwaves
相关产品推荐
相关产品推荐

