2016-10-14 3 views
2

Я прочитал все возможные ссылки о смарте-указателях, перемещать семантику и итераторы, но я до сих пор пытаюсь понять, почему после C++ 14 кода: ошибка сегментацияИтерация вектор уникального указателя

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

using namespace std; 

int main(int argc, char **argv) 
{ 
    vector<unique_ptr<int>> ints (10); 

    for(int i = 0; i < 10; ++i) { 
    unique_ptr<int> number = make_unique<int>(5); 
    ints.push_back(move(number)); 
    } 

    for(auto& n : ints) { 
    cout << *n << endl; 
    } 

    return 0; 
} 

Собрана с :

g++ <filename> -std=c++14 -o <executable> 

ответ

5
vector<unique_ptr<int>> ints (10); 

Это инициализирует vector из 10 unique_ptr S со значениями по умолчанию. То есть, нулевые указатели.

Затем вы пытаетесь разыменовать их в цикле.

вероятно Вы намеревался сказать

vector<unique_ptr<int>> ints; 
ints.reserve(10); // changes capacity, but not size 
+0

Ну, это было глупо, резерв() делает работу, то –

+0

Или 'вектор > Интс (10,5)' без петли – Trevir

+2

Это не будет работать, @Trevir. '5' будет использоваться для инициализации' unique_ptr ', что является бессмысленным. – krzaq

3
vector<unique_ptr<int>> ints (10); 

// ... 

ints.push_back(move(number)); 

Вы выделения вектора с 10, конструируемые по умолчанию элементы, а затем добавлять элементы с push_back: первые 10 элементов инициализируются с нулевыми указателями, таким образом, segfault.

Try:

vector<unique_ptr<int>> ints (10); 

for(auto& ptr : ints) { 
    ptr = make_unique<int>(5); 
} 

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

  • Нет связанных вопросов^_^