I encountered a scenario recently whilst working with a student, and I'm struggling to understand why the following example is failing.
I have a pointer to an object Game, and Game itself has a pointer to vector<Pair>. The failing line is the last line of of main(), where I am daisy-chaining methods: 
gamePointer->getPairs()->push_back(pair);
In the above line, getPairs() returns a vector<Pair>*, and then push_back() is called to add a new Pair to the vector. This results in a read access violation. Interesting, swapping out the Game's vector<Pair> with a string, say, allows me to write the following, and it works:
gamePointer->getPairs()->append("B");
I've simplified the problem and reproduced a full example:
#include "pch.h"
#include <iostream>
#include <string>
#include <vector>
using namespace std;
class Pair 
{
private:
    string previous;
    string next;
public:
    Pair();
    Pair(string previous, string next);
    string getPrevious();
    string getNext();
    void setPrevious(string previous);
    void setNext(string next);
};
class Game 
{
private:
    vector<Pair>* pairs;
public:
    Game();
    vector<Pair>* getPairs();
    void setPairs(vector<Pair>* pairs);
};
Pair::Pair()
{
    this->setPrevious("a");
    this->setNext("b");
}
Pair::Pair(string previous, string next)
{
    this->setPrevious(previous);
    this->setNext(next);
}
string Pair::getPrevious()
{
    return this->previous;
}
string Pair::getNext()
{
    return this->next;
}
void Pair::setPrevious(string previous)
{
    this->previous = previous;
}
void Pair::setNext(string next)
{
    this->next = next;
}
Game::Game()
{
    vector<Pair> pairs;
    pairs.reserve(10);
    this->setPairs(&pairs);
}
vector<Pair>* Game::getPairs()
{
    return this->pairs;
}
void Game::setPairs(vector<Pair>* pairs)
{
    this->pairs = pairs;
}
int main()
{
    Game game;
    Game* gamePointer = &game;
    Pair pair("Previous", "Next");
    gamePointer->getPairs()->push_back(pair);
}
 
     
    