【发布时间】:2020-08-11 07:12:44
【问题描述】:
我修改了@Timo 的answer 中使用的代码,试图了解shared_ptr 和自定义删除器的工作原理。
这是新代码的link,或者就在这里:
#include <memory>
#include <vector>
#include <iostream>
#include <string>
class TopicPointer
{
public:
TopicPointer(int x) : _x(std::move(x))
{
}
~TopicPointer(){
std::cout << "Deleting " << _x << std::endl;
}
int GetX()
{
return _x;
}
private:
int _x;
};
class Topic
{
std::string name;
std::shared_ptr<TopicPointer> _topicPointer;
public:
Topic(std::string name,std::shared_ptr<TopicPointer> topicPointer) : name(move(name)), _topicPointer(std::move(topicPointer)) {}
~Topic(){
std::cout << "Deleting " << name << std::endl;
}
};
struct Deleter
{
public:
void operator()(TopicPointer* ptr)
{
std::cout << "deleting topic " << ptr->GetX() << '\n';
}
};
class TopicsCache
{
public:
std::unique_ptr<Topic>&& createTopic(std::string name, int y)
{
auto topicPtr = new TopicPointer(y);
return std::move(std::unique_ptr<Topic>(new Topic(move(name),std::shared_ptr<TopicPointer>(topicPtr, Deleter()))));
}
};
class Subject
{
public:
Subject(std::vector<std::unique_ptr<Topic>> &&topics) : _topics (std::move(topics))
{
}
private:
std::vector<std::unique_ptr<Topic>> _topics;
};
TopicsCache cache;
Subject BuildSubject()
{
std::vector<std::unique_ptr<Topic>> topics;
std::cout << "Creating topic 1\n";
topics.emplace_back(std::move(cache.createTopic("a",1)));
std::cout << "Created topic 1\n";
std::cout << "Creating topic 2\n";
topics.emplace_back(std::move(cache.createTopic("b",2)));
std::cout << "Created topic 2\n";
topics.emplace_back(std::move(cache.createTopic("c",3)));
topics.emplace_back(std::move(cache.createTopic("d",4)));
return Subject(std::move(topics));
}
int main()
{
Subject subject = BuildSubject();
std::cout << "Done";
}
如您所见,从BuildSubject() 的输出:
创建主题 1
删除一个
删除主题 1
初始化温度 1
创建主题 1
创建主题 2
删除 b
删除主题 2
创建主题 2
删除 c
删除主题 3
删除 d
shared_ptr 在初始化为temp 变量之前被删除。
我认为当 shared_ptr 被复制时,引用计数会更新? std::move 也不保留引用计数吗?
如何阻止 shared_ptr 被提前释放?
谢谢
【问题讨论】:
-
抱歉,我不会通过外部链接来了解问题所在。并且外部链接可能会在几天前失效,并且您问题的全部内容都是无用的。
-
@Klaus 这是一段巨大的代码,但我会修改问题
-
尽量让你的问题保持独立,不要只是塞进一堆指向其他东西的链接。
-
如果您的示例代码太大,请将其缩减为可编译的最小示例!
-
提供一些minimal reproducible example,学习使用valgrind
标签: c++