std::move() 与 priority_queue.top()
std::move() with priority_queue.top()
我是智能指针的新手。最近我开始进行一些并行模拟,我认为 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
中获取指针,我期待的是第二种方式return 1 in use_count()
。但是,无论我是否使用 std::move()
获取队列中的顶部指针,我都看到了 2 的值。我用 g++ -std=c++0x [FileName]
编译
有人能指出我哪里做错了吗?以上两种方法是否表明我还有额外的时间?
queue.top()
returnsconst_reference
,const不能动。由于不允许修改优先级队列中的元素,因此返回的 Const 会破坏优先级队列中的顺序。
移动不会删除指向的对象。它把它留在一些 "valid but unspecified state." (他们的话,不是我的话。)或者至少如果 Base 和 Derived 遵守规则它会。如果您使用的不是 Derived,而是 std::strings,它们可能会保留为空字符串,但实现将它们保留为 "Surprise! Moved out." 是合法的。
priority_queue::top
returns 一个 const&
到顶部元素。
std::shared_ptr<Base> p = queue.top();
上面的行创建了一个新的 shared_ptr
,它现在与 priority_queue
中的 shared_ptr
共享顶部元素的所有权,因此 use_count
是 2。
std::move
不影响结果,因为 将调用 shared_ptr
复制构造函数,与上面的行相同。
要将 use_count
保持为 1,请使用
std::shared_ptr<Base> const& p = queue.top();
这应该给你 use_count of 1.
const std::shared_ptr<Base>& p = queue.top();
而且,这应该给你 use_count of 2.
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';
}
我是智能指针的新手。最近我开始进行一些并行模拟,我认为 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
中获取指针,我期待的是第二种方式return 1 in use_count()
。但是,无论我是否使用 std::move()
获取队列中的顶部指针,我都看到了 2 的值。我用 g++ -std=c++0x [FileName]
有人能指出我哪里做错了吗?以上两种方法是否表明我还有额外的时间?
queue.top()
returnsconst_reference
,const不能动。由于不允许修改优先级队列中的元素,因此返回的 Const 会破坏优先级队列中的顺序。
移动不会删除指向的对象。它把它留在一些 "valid but unspecified state." (他们的话,不是我的话。)或者至少如果 Base 和 Derived 遵守规则它会。如果您使用的不是 Derived,而是 std::strings,它们可能会保留为空字符串,但实现将它们保留为 "Surprise! Moved out." 是合法的。
priority_queue::top
returns 一个 const&
到顶部元素。
std::shared_ptr<Base> p = queue.top();
上面的行创建了一个新的 shared_ptr
,它现在与 priority_queue
中的 shared_ptr
共享顶部元素的所有权,因此 use_count
是 2。
std::move
不影响结果,因为 shared_ptr
复制构造函数,与上面的行相同。
要将 use_count
保持为 1,请使用
std::shared_ptr<Base> const& p = queue.top();
这应该给你 use_count of 1.
const std::shared_ptr<Base>& p = queue.top();
而且,这应该给你 use_count of 2.
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';
}