2015-02-05 2 views
2

Я понял, что вызов функции-члена в содержимом перемещенного объекта std::unique_ptr является неопределенным поведением. Мой вопрос: если я позвоню .get() на unique_ptr и , то переместите его, будет ли указатель оригинала .get() указывать на содержимое оригинального уникального указателя?Является ли содержимое указателя на содержимое unique_ptr действительным после перемещения unique_ptr?

Другими словами,

std::unique_ptr<A> a = ... 
A* a_ptr = a.get(); 
std::unique_ptr<A> a2 = std::move(a); 
// Does *a_ptr == *a2? 

Я думаю, что это делает, но я хочу, чтобы убедиться.

(«содержание», вероятно, не то слово. Я имею в виду данные, которые вы получаете, когда вы разыменования указателя)

+0

Объект, расположенный за этим указателем, не уничтожается. И адрес объекта не может измениться. Таким образом, адрес, который у вас есть, должен быть действительным. – Columbo

+0

@ drescherjm Нет, после переезда первый unique_ptr ничего не владеет. – juanchopanza

+0

Я вижу сейчас. Я ошибочно считал, что a_ptr использовался в движении (что для меня не имело смысла - нужно было внимательно прочитать). – drescherjm

ответ

3

Просто переместив unique_ptr только изменяет владельца на заостренный к объекту, но не отменяет (удали это. Указатель, на который указывает unique_ptr<>::get(), будет действителен, если он не был удален. Он будет удален, например, деструктором владельца unique_ptr<>. Таким образом:

obj*ptr = nullptr;       // an observing pointer 
{ 
    std::unique_ptr<obj> p1; 
    { 
    std::unique_ptr<obj> p2(new obj);  // p2 is owner 
    ptr = p2.get();       // ptr is copy of contents of p2 
    /* ... */        // ptr is valid 
    p1 = std::move(p2);      // p1 becomes new owner 
    /* ... */        // ptr is valid but p2-> is not 
    }           // p2 destroyed: no effect on ptr 
    /* ... */         // ptr still valid 
}           // p1 destroyed: object deleted 
/* ... */         // ptr invalid! 

Конечно, вы никогда не должны пытаться использовать unique_ptr, который был перемещен из, потому что перемещенных-из unique_ptr не имеют содержимый. Таким образом,

std::unique_ptr<obj> p1(new obj); 
std::unique_ptr<obj> p2 = std::move(p1); 
p1->call_member();       // undefined behaviour 
Смежные вопросы