gpt4 book ai didi

C++ 打印 shared_ptr 在树中的使用计数

转载 作者:行者123 更新时间:2023-11-30 01:35:11 28 4
gpt4 key购买 nike

我无法理解为什么当我以不同方式打印一棵树时,我的共享指针得到不同数量的 use_counts()。

使用下面的代码,当我调用方法“one->Print()”时,我似乎错误地为 one 的直接子级获得了 2 个引用,但是当使用“one->Print(one)”时我得到了正确的 refs 数量,即 1。

我如何更改我的代码,以便“one->Print()”为树中的所有节点返回正确数量的引用?

#include <iostream>
#include <memory>

template<class T> using sp = std::shared_ptr<T>;

struct Node {

int value;
sp<Node> child;
Node(int value): value {value} {}

inline void Print() const {
Print(std::make_shared<Node>(*this));
}

inline void Print(const sp<Node>& ptr) const {
Print(ptr, "", false);
}

void Print(const sp<Node>& ptr, const std::string& prepend, bool isEnd) const {
if(ptr != nullptr) {
std::cout << prepend << (isEnd ? "└────" : "├────");
std::cout << " " << ptr->value << " (" << ptr.use_count() << ")" << std::endl;
} else {
std::cout << " " << ptr->value << std::endl;
}
if(ptr->child != nullptr) {
Print(ptr->child, prepend + (isEnd ? " " : "│ "), false);
}
}

};

int main(int argc, char * argv[])
{
sp<Node> one = std::make_shared<Node>(1);
one->child = std::make_shared<Node>(2);
one->child->child = std::make_shared<Node>(3);
one->child->child->child = std::make_shared<Node>(4);
one->child->child->child = std::make_shared<Node>(5);

one->Print();

one->Print(one);

return 0;
}

输出如下:

一个->打印();

├──── 1 (1)
│ └──── 2 (2)
│ └──── 3 (1)
│ └──── 5 (1)

一->打印(一);

├──── 1 (1)
│ └──── 2 (1)
│ └──── 3 (1)
│ └──── 5 (1)

最佳答案

这是因为你使用了std::make_shared<Node>(*this)它创建了 *this 的拷贝( one ),它将复制 this->child ( one->chile ) 并增加引用计数器。


你想要的可能是继承自 enable_shared_from_this 并使用 shared_from_this , 那么你会得到

├──── 1 (2)
│ └──── 2 (1)
│ └──── 3 (1)
│ └──── 5 (1)

此外,如果您不需要引用计数器(通常为 true),如果您不打算管理资源,则不需要智能指针,您可以简单地接受 Node*。 .实际上,您可以使用 this并删除此示例中的所有指针。


示例代码。 (使用 this 而不是 ptr )

struct Node: std::enable_shared_from_this<Node> {

int value;
sp<Node> child;
Node(int value): value {value} {}

void Print() const {
Print("", false);
}

void Print(const std::string& prepend, bool isEnd) const {
std::cout << prepend << (isEnd ? "└────" : "├────");
std::cout << " " << this->value << " (" << shared_from_this().use_count()-1 /*remove current count*/ << ")" << std::endl;
if(this->child) {
this->child->Print(prepend + (isEnd ? " " : "│ "), false);
}
}

};

您还可以使用 week_from_this (c++17), wandbox example

关于C++ 打印 shared_ptr 在树中的使用计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54623124/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com