如何解决shared_ptr会被提前删除
我修改了@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提早处置?
谢谢
解决方法
我在这里看到了问题:
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()))));
}
您正在返回对临时对象的引用,该引用在您使用时无效:
topics.emplace_back(std::move(cache.createTopic("a",1)));
您应该返回一个值:
std::unique_ptr<Topic> createTopic(std::string name,int y)
{
auto topicPtr = new TopicPointer(y);
return std::unique_ptr<Topic>(new Topic(move(name),Deleter())));
}
总体而言,您的代码中存在很多问题。移动整数?拥有不删除的删除器?是否具有右值引用类型的参数(接收器模式)?创建原始指针并将其传递到下一行的std::shared_ptr
构造函数中?您会忽略C ++的所有惯用语,很快就会大吃一惊。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。