改变动态内存内容为啥要用unique确认是否唯一
改变动态内存内容为何要用unique确认是否唯一?
书上说:
reset经常unique一起使用,来控制多个shared_ptr共享的对象。
为何要这样呢?就不能不管是否唯一,直接*p += newVal; 吗?
------解决思路----------------------
Copy on write。
在这种情况下,每个拥有者实际是想独有这个指针的,也就是我无论怎么修改,都不影响其它的拥有者的读到的值。简单的实现是每多一个拥有者,就直接把所有数据拷贝一遍。但是由于可能很多拥有者并不会有写操作(或者并不会立即有写操作),所以在写之前,所有人是可以共享这份数据的,反正读出来都一样。但是,一旦有人要写,他就需要先把数据拷贝一份,已保证不影响其它人。
在写的时候才发生真正的拷贝。(copy on write)
比如 string 的拷贝就可以这样,因为很多时候 string 拷来拷去都并不会更改其内容,所以可以只拷贝指针,多个 string 对象很可能共享同一个指针。但是一旦有人想改,就需要真正的拷贝一份出来,这样自己改了也不影响其它人。
(也只是一种可能的实现,并不是说 std::string 就是这样的)
这只是 share_ptr 的一种应用场景而已,也并不是所有的 shared_ptr 都会这样用。
书上说:
reset经常unique一起使用,来控制多个shared_ptr共享的对象。
if (! p.unique()) //如果p不是它所管理对象的唯一引用者,则为它重新分配
p.reset(new int(100));
*p += newVal; // 现在p是唯一的用户,可以改变对象的值
为何要这样呢?就不能不管是否唯一,直接*p += newVal; 吗?
------解决思路----------------------
Copy on write。
在这种情况下,每个拥有者实际是想独有这个指针的,也就是我无论怎么修改,都不影响其它的拥有者的读到的值。简单的实现是每多一个拥有者,就直接把所有数据拷贝一遍。但是由于可能很多拥有者并不会有写操作(或者并不会立即有写操作),所以在写之前,所有人是可以共享这份数据的,反正读出来都一样。但是,一旦有人要写,他就需要先把数据拷贝一份,已保证不影响其它人。
在写的时候才发生真正的拷贝。(copy on write)
比如 string 的拷贝就可以这样,因为很多时候 string 拷来拷去都并不会更改其内容,所以可以只拷贝指针,多个 string 对象很可能共享同一个指针。但是一旦有人想改,就需要真正的拷贝一份出来,这样自己改了也不影响其它人。
(也只是一种可能的实现,并不是说 std::string 就是这样的)
这只是 share_ptr 的一种应用场景而已,也并不是所有的 shared_ptr 都会这样用。