与Java中的GC概念类似,当一个对象不再被其他东西引用时,它会被标记为GC。
unique_ptr的工作原理与此类似吗?
如果说我有一个包含左/右std::unique_ptr<BSTNode>
节点的数据结构(树)。假设我有一个删除函数remove(std::unique_ptr<BSTNode>& root, int val)
,如果我转到包含BSTNode
的{{1}}的父级,并将nullptr分配给左侧或右侧子字段(val
包含std::unique_ptr<BSTNode>
),智能指针会自毁吗?
或者我应该val
删除功能中的智能指针吗?这个问题主要是我不理解的范围问题。
答案 0 :(得分:2)
如果我转到包含val的BSTNode的父级,并将nullptr分配给左子场或右子场(这是包含val的std :: unique_ptr),智能指针会自毁吗?
智能指针会破坏指向的东西。
它不会破坏它自己(这就是自毁意味着什么;你可能在这里混淆了术语)。
答案 1 :(得分:0)
unique_ptr
的关键是了解 stack 变量的寿命。
unique_ptr
的内在特性与其他堆栈变量没有什么不同,只是使用其析构函数来清理拥有的内容。这是在这些指针之前广泛使用的习惯用法,称为RAII 资源获取是初始化。
如果堆栈上有unique_ptr
,即:在某个范围内声明,则在退出该范围时将执行其析构函数,并删除堆栈变量。
如果将其放在分配给堆的某些结构或类中,则在删除该容器时,它将执行其析构函数。