У меня есть следующий код:
#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()
на 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?
Вам нужно создать vector<monkey>
который будет управляться shared_ptr
.
MonkeyContainer monkeyContainer;
После вышеприведенного утверждения, что shared_ptr
указывает на nullptr
(monkeyContainer.get() == nullptr
) и deferencing его назвать emplace_back
результаты в аварии. Измените приведенную выше строку на
MonkeyContainer monkeyContainer = std::make_shared<std::vector<monkey>>();
Вы не инициализируете указатель MonkeyContainer
. Это указывает на NULL
когда вы пытаетесь emplace_back
.