2016-05-23 2 views
3

У меня есть вектор shared_ptrs, как показано ниже.Замена элементов shared_ptr в std :: vector

std::vector<std::shared_ptr<SharedThing>> things; 

Теперь, скажем, я нажимаю ряд shared_ptrs на вектор и каждый элемент теперь имеет счетчик ссылок 1.

Когда мне нужно заменить один из этих элементов с новым shared_ptr Я хочу old shared_ptr, чтобы выйти из сферы действия. Будет ли регулярное назначение элемента достигнуть этого или просто скопировать содержимое shared_ptr. Например:

things.at(0) = new_shared_ptr; 

Будет ли это уменьшает счетчик ссылок things.at (0) и приращение подсчета new_shared_ptr?

+0

Да, используйте это для отладки s. –

+2

http://en.cppreference.com/w/cpp/memory/shared_ptr/operator%3D – GManNickG

ответ

2

Да, в основном вы правы.
Чтобы быть более точным, счетчик ссылок предыдущего shared_ptr at (0) будет уменьшаться. И затем вы назначаете его новым shared_ptr, который может иметь счет 1. Похоже, что счетчик ссылок в (0) тот же, но он изменился и изменился.

Вы можете проверить его станд :: shared_ptr :: use_cout()

Для получения более подробной информации, мы можем отладить в STL, когда things.at(0) = new_shared_ptr;

включают/C++/4.8.3/бит/shared_ptr_base.h: 556

__shared_count& 
    operator=(const __shared_count& __r) noexcept 
    {  
_Sp_counted_base<_Lp>* __tmp = __r._M_pi; 
if (__tmp != _M_pi) 
    {  
    if (__tmp != 0) 
     __tmp->_M_add_ref_copy(); 
    if (_M_pi != 0) 
     _M_pi->_M_release(); 
    _M_pi = __tmp; 
    }  
return *this; 
    }  

новый один _M_add_ref_copy(), то предыдущий _M_release(), который будет уменьшать _M_use_ кол-во на 1.

3

Когда мне нужно заменить один из этих элементов на новый shared_ptr, я хочу, чтобы старый shared_ptr вышел из области видимости. Будет ли регулярный элемент назначения достичь этого?

Общий указатель на вектор не будет выходить за рамки,
, но он заменит управляемый объект с новым данным.

Призвание:

things.at(0) = new_shared_ptr; 

сохранит счетчик на 1.

Вот простой способ наблюдать это поведение:

#include <iostream> 
#include <vector> 
#include <memory> 

int main(){ 

    //vector with a shared pointer 
    std::vector<std::shared_ptr<int>> things; 
    things.push_back(std::make_shared<int>(1)); 

    //prints 1 
    std::cout << things.at(0).use_count() << '\n'; 

    //assign a new value 
    things.at(0) = std::make_shared<int>(2); 

    //still prints 1 
    std::cout << things.at(0).use_count() << '\n'; 
} 

Хотя не часть вашего вопроса, то это часто рекомендуется использовать make_shared вместо new.

+1

Это не «сохранение счета», вы читаете счет с совершенно другого объекта. (Использовать счетчик не является частью 'shared_ptr', а частью блока метаданных для целевого объекта) –

Смежные вопросы