VS2012中的emplace_back和shared_ptr向量

时间:2013-10-07 21:42:13

标签: c++ c++11 visual-studio-2012 stl shared-ptr

我有以下代码:

#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并尝试使用11月CTP和默认编译器。

由于缺乏助推支持和其他因素,我无法使用VS2013 atm - MSVC11是否有修复?

2 个答案:

答案 0 :(得分:2)

您需要创建一个由vector<monkey>管理的shared_ptr

MonkeyContainer monkeyContainer;

在上述声明之后,shared_ptr指向nullptrmonkeyContainer.get() == nullptr),并将其引用以致电emplace_back会导致崩溃。将上面的行更改为

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

答案 1 :(得分:1)

您没有初始化MonkeyContainer指针。当您尝试NULL时,它指向emplace_back