【发布时间】:2019-03-29 12:03:30
【问题描述】:
我最近在与学生一起工作时遇到了一个场景,我很难理解为什么以下示例会失败。
我有一个指向对象Game 的指针,而Game 本身也有一个指向vector<Pair> 的指针。失败的行是main() 的最后一行,我是菊花链方法:
gamePointer->getPairs()->push_back(pair);
在上述行中,getPairs() 返回一个vector<Pair>*,然后调用push_back() 将一个新的Pair 添加到向量中。这导致read access violation。有趣的是,将Game 的vector<Pair> 替换为string,例如,允许我编写以下内容,并且它有效:
gamePointer->getPairs()->append("B");
我已经简化了问题并复制了一个完整的例子:
#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);
}
【问题讨论】:
-
你不是在尝试存储,然后访问指向 Game 构造函数本地向量的向量指针吗?
-
您永远不应该存储您使用
&获取的指针以供以后使用。你的向量已经不复存在了。 (提示十位评论者指出“从不”有点强烈,我的回答是“有时可以,但这并不意味着你应该”。) -
我很好奇您所说的“与学生一起工作”是什么意思。
-
关于using namespace std...
-
你应该习惯于实现构造函数的初始化列表(不要与
std::initialiser_list混淆!):Pair() : previous("a"), next("b") { };您避免默认初始化+分配,而是通过参数直接初始化。此外,某些类型(引用、非默认构造类型)只能以这种方式初始化。