2014-10-22 5 views
0

В чем преимущество использования интеллектуальных указателей внутри контейнеров STL (векторов, карт и т. Д.), Зная, что эти контейнеры управляют уже памятью?C++ Использование интеллектуальных указателей внутри контейнеров STL

Пример:

std::vector<std::unique_ptr<int>> 

вместо

std::vector<int*> 
+3

Можете ли вы привести пример того, что именно вы имеете в виду? – csnate

+0

std :: vector > – user2591935

+3

'vector' управляет памятью указателями, а не целыми числами. См. [Этот вопрос] (http://stackoverflow.com/q/8036474/166749). –

ответ

5

Если объекты являются указателями это не достаточно, чтобы управлять памятью указатели занимают. Вам также нужно управлять тем, на что указывают указатели. Это хорошая идея для хранения объектов, на которые указываются вместо указателей (в случае вашего примера std::vector<int> было бы уместно), однако, если у вас есть полиморфные объекты, которые невозможно.

0

Вы можете использовать его, когда вам нужно провести массив ссылок на объекты. Таким образом, я могу сортировать массив ссылок, не перемещая объекты в памяти.

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

int main() 
{ 
     std::shared_ptr<int> foo(new int(3)); 
     std::shared_ptr<int> baz(new int(5)); 
     std::vector<std::shared_ptr<int> > bar; 
     bar.push_back(baz); 
     bar.push_back(foo); 

     std::sort(bar.begin(), bar.end(), [](std::shared_ptr<int> a, std::shared_ptr<int> b) 
     { 
       return *a < *b; 
     }); 

     for(int i = 0; i < bar.size(); ++i) 
       std::cout << *bar[i] << std::endl; 

     return 0; 
} 

Печать:

3 
5 
+0

'shared_ptr's [сравнивать значения внутреннего указателя] (http://en.cppreference.com/w/cpp/memory/shared_ptr/operator_cmp), а не их содержимое. –

+0

Вы правы. Обновлен мой пример. – csnate

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