2013-10-07 4 views
0

У меня есть следующий код:emplace_back и shared_ptr вектор в VS2012

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

struct monkey 
{ 
    int mA, mB; 

    monkey(int a, int b) : mA(a), mB(b) 
    { 
    } 
}; 

typedef std::shared_ptr<std::vector<monkey>> MonkeyContainer; 


int main() 
{ 
    MonkeyContainer monkeyContainer; 
    monkeyContainer->emplace_back(1, 2); 
} 

И всегда падает на emplace_back(). Но он компилируется отлично, и я не вижу никакой проблемы. Почему он падает? Вот исключение брошено и строки кода:

Unhandled exception at 0x00FE2299 in ConsoleApplication2.exe: 0xC0000005: Access violation reading location 0x00000008. 

на

vector.h - line 894: _VARIADIC_EXPAND_0X(_VECTOR_EMPLACE, , , ,) 

Я использую VS2012 и попытались как с ноября CTP и компилятором по умолчанию.

Я не могу использовать VS2013 atm из-за отсутствия поддержки усиления и других факторов - есть ли исправление для MSVC11?

ответ

2

Вам необходимо создать vector<monkey>, которым будет управлять shared_ptr.

MonkeyContainer monkeyContainer; 

После вышеприведенного заявления shared_ptr указует на nullptr (monkeyContainer.get() == nullptr) и deferencing его назвать emplace_back результатов в аварии. Измените приведенную выше строку на

MonkeyContainer monkeyContainer = std::make_shared<std::vector<monkey>>(); 
+0

ahh такой глупый контроль со мной, спасибо – KaiserJohaan

1

Вы не инициализируете указатель MonkeyContainer. Он указывает на NULL при попытке emplace_back.

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