首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用priority_queue.top()移动()

使用priority_queue.top()移动()
EN

Stack Overflow用户
提问于 2018-03-08 03:40:42
回答 4查看 565关注 0票数 1

我对聪明的指点很陌生。最近,我开始做一些并行模拟,我认为shared_ptr将有助于防止内存泄漏。我听说增加实例数量会导致不可忽略的额外时间开销,所以我希望避免这样做。

在我的代码中,我使用priority_queue来管理模拟中的事件。为了确保我理解这些容器中的shared_ptr发生了什么,我做了一些测试:

代码语言:javascript
复制
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]编译

有人能指出我哪里做错了吗?以上两种方法是否都表明我还会有额外的时间?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-03-08 03:54:51

priority_queue::top将一个const&返回到顶部元素。

代码语言:javascript
复制
std::shared_ptr<Base> p = queue.top();

上面的行创建了一个新的shared_ptr,它现在与位于priority_queue中的shared_ptr共享顶层元素的所有权,因此use_count是2。

std::move不影响结果,因为 object将调用与上面一行相同的shared_ptr复制构造函数。

若要将use_count保持在1,请使用

代码语言:javascript
复制
std::shared_ptr<Base> const& p = queue.top();
票数 4
EN

Stack Overflow用户

发布于 2018-03-08 03:55:04

这应该会给你1的use_count。

代码语言:javascript
复制
const std::shared_ptr<Base>& p = queue.top();

而且,这应该会给你2的use_count。

代码语言:javascript
复制
std::shared_ptr<Base> p = queue.top();

_

代码语言:javascript
复制
#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';

}
票数 1
EN

Stack Overflow用户

发布于 2018-03-08 03:48:39

queue.top()返回const_reference,const不能移动。由于不允许修改优先级队列中的元素,所以返回的Const可以破坏优先级队列中的顺序。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49165009

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档