0

次のコードがあります。

#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 を使用しており、November CTP とデフォルト コンパイラの両方を試しました。

ブースト サポートがないなどの理由で VS2013 atm を使用できません。MSVC11 の修正はありますか?

4

2 に答える 2

2

vector<monkey>によって管理されるを作成する必要がありますshared_ptr

MonkeyContainer monkeyContainer;

上記のステートメントの後に( )shared_ptrを指し、それを逆参照して呼び出すと、クラッシュが発生します。上記の行を次のように変更しますnullptrmonkeyContainer.get() == nullptremplace_back

MonkeyContainer monkeyContainer = std::make_shared<std::vector<monkey>>();
于 2013-10-07T21:52:34.447 に答える
1

MonkeyContainerポインタを初期化していません。NULLしようとすると を指していますemplace_back

于 2013-10-07T21:44:13.900 に答える