【发布时间】:2018-07-09 17:33:31
【问题描述】:
所以问题是,当我尝试将非动态 obj 推送到 playerList 或尝试删除 n 时,我得到 segfault(核心转储)。我假设问题是在 Helper 类被破坏时引起的,因此向量也被破坏,因此它试图破坏本身不再存在的对象。但是,当我使用 playerList.clear() 时,问题仍然存在。我想我可以用 ~Helper() 销毁 playerList() 中的对象。但我想知道为什么我不能使用非动态对象,而只是在 Run() 结束时将它们从 playerList 中清除。
class Helper{
public:
void Run();
private:
std::vector<Player>playerList;
...
};
这就是 Run() 的样子:
using namespace std;
void Helper::Run(){
Player *n = new Player();
playerList.push_back(*n); //Yup. There is a memleak
}
还有 播放器.h:
class Player{
public:
...
~Player();
private:
...
IClass* typeOfClass = new Warrior();
};
和~玩家:
Player::~Player(){
delete typeOfClass;
}
和战士(对问题没有影响)
class Warrior {
public:
int GetMeleeAttack();
int GetRangedAttack();
int GetMagicAttack();
int AgilityAction();
int StrengthAction();
int IntelligenceAction();
void WhoAmI();
private:
};
Warrior 的方法只返回一些整数。
【问题讨论】:
-
Run方法看起来很奇怪。它有内存泄漏。为什么要分配任何新内存?什么是勇士?请发minimal reproducible example -
使用 std::shared_ptr
-
无关:除了删除赋值运算符,还应该删除复制构造函数。
-
我已经描述了它有内存泄漏,因为我无法使用 delete n。它导致了段错误。
-
停止使用原始指针,所有这些问题都会消失
标签: c++ vector segmentation-fault