打开和关闭所有权¶
当我们把对象保存在容器里,容器是否拥有对象的所有权。
堆栈就是容器。使用堆栈举例。
简单的堆栈模版¶
使用的是数组
push进堆栈的时候并没有真正的把对象放进去,而是拷贝了一个放进去,和原来的对象是分开的。不影响原来的数据。
堆栈销毁的时候,会把数组里的对象都销毁。堆栈里的数组是归堆栈所有,数组里的对象也是归堆栈所有。
链表的堆栈模版¶
使用的是链表
在堆栈里保存的是指针,不是对象的拷贝。
push 的时候是把指针push进去。堆栈里是对象的地址指针,指针指向原来的对象。
删除堆栈的时候会利用指针把对象也删除。
有些时候希望堆栈不要删除对象,堆栈不拥有所有权。可以通过一个bool变量,在构造函数里可以设置所有权,默认为true有所有权。bool变量用在析构函数里,如果没有所有权就什么都不做直接return,有所有权就利用循环把堆栈所有对象都删除。
把对象从堆栈pop取出来的时候,用一个指针接收。数据要不要删除,由客户端决定。要删除就delete不删除就不delete。
pop出来之后对象还存在,只是堆栈中没有了,delete的话对象才会销毁,不delete就不销毁。
堆栈被销毁的时候,指针没有了,但是对象还在,因为没有所有权。如果有所有权的话当堆栈被销毁,则堆栈里的对象也会被销毁。
要删除堆栈的时候,堆栈里指针指向的数据要不要删除
如果堆栈拥有对象所有权,就可以销毁对象,调用对象的析构函数。
如果堆栈不拥有对象的所有权,则删除堆栈的时候,指针被删除,对象还存在。
在容器的设计的时候,根据需要容器是否拥有所有权。灵活使用。