跳转至

打开和关闭所有权

当我们把对象保存在容器里,容器是否拥有对象的所有权。

堆栈就是容器。使用堆栈举例。

简单的堆栈模版

使用的是数组

push进堆栈的时候并没有真正的把对象放进去,而是拷贝了一个放进去,和原来的对象是分开的。不影响原来的数据。

堆栈销毁的时候,会把数组里的对象都销毁。堆栈里的数组和数组里的对象是归堆栈所有。

链表的堆栈模版

使用的是链表

在堆栈里保存的是指针,不是对象的拷贝。

push 的时候是把指针push进去。堆栈里是对象的地址指针,指针指向原来的对象。

删除堆栈的时候会利用指针把对象也删除。

有些时候希望堆栈不要删除对象,堆栈不拥有所有权。可以通过一个bool变量,在构造函数里可以设置所有权,默认为true有所有权。bool变量用在析构函数里,如果没有所有权就什么都不做直接return,有所有权就利用循环把堆栈所有对象都删除。

把对象从堆栈pop取出来的时候,用一个指针接收。数据要不要删除,由客户端决定。要删除就delete不删除就不delete。

pop出来之后对象还存在,只是堆栈中没有了,delete的话对象才会销毁,不delete就不销毁。

要删除堆栈的时候,堆栈里指针指向的数据要不要删除:

  • 如果堆栈拥有对象所有权:当堆栈被销毁时,就可以销毁堆栈里的对象,调用对象的析构函数
  • 如果堆栈不拥有对象的所有权:则堆栈被销毁的时候,只是指针被删除,原对象还存在。

在容器的设计的时候,根据需要容器是否拥有所有权。灵活使用。