我对聪明的指点很陌生。最近,我开始做一些并行模拟,我认为shared_ptr将有助于防止内存泄漏。我听说增加实例数量会导致不可忽略的额外时间开销,所以我希望避免这样做。
在我的代码中,我使用priority_queue来管理模拟中的事件。为了确保我理解这些容器中的shared_ptr发生了什么,我做了一些测试:
std::priority_queue<std::shared_ptr<Base>> queue;
queue.push(std::make_shared<Derived>());
std::shared_ptr<Base> p = queue.top();
//std::shared_ptr<Base> p = std::move(queue.top());
std::cout << "Created a shared Derived (as a pointer to Base)\n"
<< " p.get() = " << p.get()
<< ", p.use_count() = " << p.use_count() << '\n';使用上述两种不同的方法从priority_queue获取指针,我期望第二种方式在use_count()中返回1。但是,无论是否使用std::move()获取队列中的顶部指针,我都看到了值为2的值。我用g++ -std=c++0x [FileName]编译
有人能指出我哪里做错了吗?以上两种方法是否都表明我还会有额外的时间?
发布于 2018-03-08 03:54:51
priority_queue::top将一个const&返回到顶部元素。
std::shared_ptr<Base> p = queue.top();上面的行创建了一个新的shared_ptr,它现在与位于priority_queue中的shared_ptr共享顶层元素的所有权,因此use_count是2。
std::move不影响结果,因为 object将调用与上面一行相同的shared_ptr复制构造函数。
若要将use_count保持在1,请使用
std::shared_ptr<Base> const& p = queue.top();发布于 2018-03-08 03:55:04
这应该会给你1的use_count。
const std::shared_ptr<Base>& p = queue.top();而且,这应该会给你2的use_count。
std::shared_ptr<Base> p = queue.top();_
#include <iostream>
#include <memory>
#include <queue>
using namespace std;
class Base
{
public:
Base() {}
virtual void print()
{
cout << "Base" << endl;
}
};
class Derived
:
public Base
{
public:
Derived() {}
void print()
{
cout << "Derived" << endl;
}
};
int main()
{
std::priority_queue<std::shared_ptr<Base>> queue;
queue.push(std::make_shared<Derived>());
const std::shared_ptr<Base>& p = queue.top();
//std::shared_ptr<Base> p = std::move(queue.top());
std::cout << "Created a shared Derived (as a pointer to Base)\n"
<< " p.get() = " << p.get()
<< ", p.use_count() = " << p.use_count() << '\n';
}发布于 2018-03-08 03:48:39
queue.top()返回const_reference,const不能移动。由于不允许修改优先级队列中的元素,所以返回的Const可以破坏优先级队列中的顺序。
https://stackoverflow.com/questions/49165009
复制相似问题