假设我设计一个二叉树,并在其中包含一个指向左右子节点的指针。
#include
#include
class Node {
int value;
public:
std::shared_ptr leftPtr;
std::shared_ptr rightPtr;
Node(int val) : value(val) {
std::cout << "Constructor" << std::endl;
}
~Node() {
std::cout << "Destructor" << std::endl;
}
};
int main() {
std::shared_ptr ptr = std::make_shared(4);
ptr->leftPtr = std::make_shared(2);
ptr->rightPtr = std::make_shared(5);
return 0;
}
上面的例子运行正常。
查看修改过的代码
#include
#include
class Node {
int value;
public:
std::shared_ptr leftPtr;
std::shared_ptr rightPtr;
std::shared_ptr parentPtr;
Node(int val) : value(val) {
std::cout << "Constructor" << std::endl;
}
~Node() {
std::cout << "Destructor" << std::endl;
}
};
int main() {
std::shared_ptr ptr = std::make_shared(4);
ptr->leftPtr = std::make_shared(2);
ptr->leftPtr->parentPtr = ptr;
ptr->rightPtr = std::make_shared(5);
ptr->rightPtr->parentPtr = ptr;
std::cout << "ptr reference count = " << ptr.use_count() << std::endl;
std::cout << "ptr->leftPtr reference count = " << ptr->leftPtr.use_count() << std::endl;
std::cout << "ptr->rightPtr reference count = " << ptr->rightPtr.use_count() << std::endl;
return 0;
}
输出:
Constructor
Constructor
Constructor
ptr reference count = 1
ptr->leftPtr reference count = 1
ptr->rightPtr reference count = 1
std::shared_ptr ptr = std::make_shared(4);
std::weak_ptr weakPtr(ptr);weak_ptr
对于weak_ptr对象,我们不能直接使用运算符*和 - >来访问关联的内存。首先,我们必须通过调用weak_ptr对象的的lock()函数来创建一个shared_ptr,这样只有我们可以使用它。
#include
#include
int main() {
std::shared_ptr ptr = std::make_shared(4);
std::weak_ptr weakPtr(ptr);
std::shared_ptr ptr_2 = weakPtr.lock();
if (ptr_2)
std::cout << (*ptr_2) << std::endl;
std::cout << "Reference Count :: " << ptr_2.use_count() << std::endl;
if (weakPtr.expired() == false)
std::cout << "Not expired yet" << std::endl;
return 0;
}
关键点:如果shared_ptr已经被删除,lock()会返回空的shared_ptr
#include
#include
class Node {
int value;
public:
std::shared_ptr leftPtr;
std::shared_ptr rightPtr;
//只需要把shared_ptr改为weak_ptr;
std::weak_ptr parentPtr;
Node(int val) : value(val) {
std::cout << "Constructor" << std::endl;
}
~Node() {
std::cout << "Destructor" << std::endl;
}
};
int main() {
std::shared_ptr ptr = std::make_shared(4);
ptr->leftPtr = std::make_shared(2);
ptr->leftPtr->parentPtr = ptr;
ptr->rightPtr = std::make_shared(5);
ptr->rightPtr->parentPtr = ptr;
std::cout << "ptr reference count = " << ptr.use_count() << std::endl;
std::cout << "ptr->leftPtr reference count = " << ptr->leftPtr.use_count() << std::endl;
std::cout << "ptr->rightPtr reference count = " << ptr->rightPtr.use_count() << std::endl;
return 0;
}
输出:
Constructor
Constructor
Constructor
ptr reference count = 1
ptr->leftPtr reference count = 1
ptr->rightPtr reference count = 1
Destructor
Destructor
Destructor