C++ 指针向量,传递次数过多?
Posted
技术标签:
【中文标题】C++ 指针向量,传递次数过多?【英文标题】:C++ Vector of Pointers, too many passes? 【发布时间】:2011-07-17 22:29:26 【问题描述】:几个小时以来,我一直在试图弄清楚如何解决这个 seg-fault 问题。
我有一个 C++ 纸牌游戏,四个玩家。玩家(基类)可以是计算机或人类(派生类)。为了存储它们,我有另一个名为 playerContainer 的类,它有自己的函数并使用玩家指针的私有成员向量。
std::vector<Player*> players_;
当我向向量中添加一个新玩家时,我会这样做:
Human *newPlayer = new Human();
container.add(newPlayer);
add 在哪里:
void playerContainer::add(Player* newPlayer)
players_.push_back(newPlayer);
然后我有一个名为 gameLogic 的类,它有一个私有成员 playerContainer 并执行玩家初始化(以及其他几件事)。
但是,在尝试将其合并到 MVC 实现中后,我遇到了段错误。
在 GUI 上,您单击一个按钮即可开始游戏。按钮调用窗口的startGame函数,该函数收集参数,然后调用它的私有成员Model类的startGame,然后调用它的私有成员gameLogic的initializePlayer函数,然后调用它的私有成员playerContainer的add函数。届时程序将中断。
经过一番测试,我发现如果我保存一个步骤,它不会出现段错误。例如,如果我给窗口对象一个gameLogic对象,然后调用它的initializePlayer函数等等,程序会正常运行而不会出错。
我确信有一个比结合 Model 和 gameLogic 类更好的解决方案,因为它们已经相当臃肿了。有人可以提供一些见解吗?
另外,如果这有点令人困惑,请让我澄清一下。我已尽力解释清楚,但涉及到这么多不同的课程,很难做到。
编辑:无法尝试将 Player* 替换为 int,代码太大,我无法及时执行此操作。
我已经尝试过 valgrind,但日志很大并且通常没有帮助。或者至少,我无法理解其中的大部分内容。想看的小伙伴可以看一下链接: http://www.scribd.com/doc/60210916/Memory-Leak
playerContainer 的 add 函数在 push_back 行上引发了 seg 错误。
我会试试调试器...
【问题讨论】:
如果您不在向量中使用 Player*,而只使用 int 会发生什么情况。注释掉任何直接使用 Player* 并运行的代码将显示您是否正在使用未初始化的播放器,或者问题是否出在其他地方。 如果您在受支持的平台上,请通过valgrind
运行您的程序。
请显示更多代码。例如您如何在实施中使用添加的播放器。你如何释放你的指针等...
我认为您应该开始查找引发分段错误的位置
通过调试器运行你的程序,当你到达你的段错误时,做一个回溯,它不仅会显示你的段错误发生在哪里,而且当段错误发生时堆栈的状态是什么.然后,您可以退一步查看堆栈并查看进行了哪些函数和调用......这应该有助于您隔离发生段错误的位置。
【参考方案1】:
您确定您的模型在某个地方,但在调用 initializePlayer 之前,实际上分配了 playerContainer?
【讨论】:
不,我不能说我完全确定。不管出于何种原因,使用将 gameLogic 对象添加到窗口的确切语法可以让一切正常。我不明白如何使用窗口和如何使用模型之间的区别。 如果没有更多代码,这很难说。 playerContainer如何声明分配,如何访问? playerContainer 使用隐式构造函数并且只有一个私有成员std::vector<Player*> players_
。访问其成员是通过重载的 [] 运算符完成的,该运算符返回 player_[i]。创建 playerContainer 本身只是作为 gameLogic 的私有成员完成的,它几乎可以做到这一点:class gameLogic private: playerContainer container;
以上是关于C++ 指针向量,传递次数过多?的主要内容,如果未能解决你的问题,请参考以下文章
C ++如何一起使用 std::adjacent 和 std::count_if 来计算向量中条件的出现次数