std :: queue :: pop()在其std :: unique_ptr数据上操作
std::queue::pop() operation on its std::unique_ptr data
我只是想知道,如果在其std::unique_ptr
数据(即nullptr
)上执行std :: Queue :: pop()会发生什么。请考虑下面的代码片段,
#include <iostream>
#include <queue>
#include <memory>
using namespace std;
class sample
{
public:
int data;
sample() {cout << "n Constructor Called" << endl;}
~sample() {cout << "n Destructor Called" << endl;}
};
void func(queue<pair<string, unique_ptr<sample>>> & q)
{
pair<string, unique_ptr<sample>> p = std::move(q.front());
try
{
q.pop();
}
catch(...)
{
cout << "n Exception occured" << endl;
}
}
int main()
{
queue<pair<string, unique_ptr<sample>>> q;
q.push((make_pair("sample obj", unique_ptr<sample>(new sample))));
func(q);
return 0;
}
在使用func
中的queue
数据时,我将std::move
用作复制构造函数和分配操作员过载功能在std::unique_ptr
中删除。这有效地将queue
内容移至pair<string, unique_ptr<sample>> p
(如果在这里错了,请纠正我),并且unique_ptr
变为nullptr,如果我执行q.pop
,将会发生什么。理想情况下,std::queue::pop
将调用使用q.pop()
检索的最古老元素的破坏者,可以在nullptr
上执行delete
?。
这很好。
pair<string, unique_ptr<sample>> p = std::move(q.front());
之后,移动了queue
的元素,其状态不确定,但仍然有效;包括可破坏。
然后q.pop();
将从queue
中删除元素,并销毁元素。如上所述,该元素将在没有问题的情况下被破坏。
可以在
nullptr
上执行delete
?
移动对象状态后,保持有效的状态意味着您无需担心它。但是,您问题的直接答案是肯定的,很好。标准库Deallocation函数对此无能为力。
相关文章:
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从持续时间构造std::chrono::system_clock::time_point
- std::具有相同基类的类的变体
- 引用 std::shared:ptr 以避免引用计数
- C++14 unique_ptr并使用已删除的函数'std::unique-ptr' unique_ptr错误
- 使用std :: String ptr的错误打印std :: String
- C++中的大小释放:全局运算符delete的正确行为是什么(void*ptr,std::size_t size)
- std::哈希表示无序映射中的唯一 PTR
- boost::shared_ptr和std::shared-ptr的同居
- 我可以用std::shared_ptr而不是boost::shared-ptr构建boost库吗
- 正确使用std智能指针以确保ptr安全
- 如何创建 std::string 包装器,它将 ptr 保留为 std::string 和 ptr 到创建该包装器实例的
- 为什么 std::string{ "const char ptr" } 有效?
- 为什么 gcc 4.9.0 中没有定义"void operator delete(void* ptr, std::size_t size) noexcept;"?
- 在 std::map 的值中使用非 ptr 是一种很好的做法吗
- 共享 PTR - C++:std::shared_ptr<T> 和 std::shared_ptr<T const> 有什么区别?