std::unique_ptr
のデータがnullptr
でstd :: queue :: pop()が実行されるとどうなるのだろうか。 func
でqueue
データでの作業中に、以下のようにstd :: queue :: pop()操作がstd :: unique_ptrデータの上にある
#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;
}
をコードスニペットを考えてみてください、私はコピーコンストラクタと代入演算子オーバーロード機能としてstd::move
を使用するにはstd::unique_ptr
に削除されます。これによりqueue
のコンテンツはpair<string, unique_ptr<sample>> p
に移動します(私が間違っていれば私を修正してください)。unique_ptr
はnullptrになります。q.pop
を実行するとどうなりますか?理想的にはstd::queue::pop
は、q.pop()
を使用して取得された最も古い要素のデストラクタを呼び出し、delete
をnullptr
?に実行することができます。
私はあなたの懸念を完全には受けていないと思いますか? 'delete nullptr;'は完全に有効な操作です。 –
すでに述べたように、 'delete nullptr'はノーオペレーションです。さらに、 '〜unique_ptr'は' nullptr'に対して 'deleter'関数を呼び出さないので、' deleter'関数が 'nullptr'に対してチェックしなくても、このコードは完全に正常です。 –