指针参数未保存到向量的类函数

时间:2014-04-21 02:26:17

标签: c++ pointers vector

我不确定如何标题,但基本上,我有这个类功能,旨在为类中的能力向量添加新的能力。

//Part of class Unit
public:
vector <Ability*>  myAbilities;
void AddAbility(Ability * ability)
{
    myAbilities.push_back(ability);
    cout<<"Ability added"<<endl;
    cout<<ability->GetName()<<endl;
    ability = NULL;
    delete ability;

}

我很确定参数中的指针在函数完成时基本消失,当我尝试在main函数中输出能力名称时,它不存在。我更喜欢使用这个函数:

AddAbility(new Fireball());

火球是一种能力的儿童类。

如何通过此函数向指向类的指针向量添加新功能?我很确定通过引用来做这件事是没有意义的,我有可能忘记一些基本的东西,但我似乎无法确定它。

2 个答案:

答案 0 :(得分:2)

如果您正在使用C ++ 11进行编译,请考虑使用shared pointers,并让系统处理内存管理:

根据Casper Von B的评论unique_ptr似乎更适合您的特定情况(已更新):

std::vector<std::unique_ptr<Ability>> myAbilities;

void AddAbility(Ability * ability)
{
    auto ptr = std::unique_ptr<Ability>(ability);
    myAbilities.push_back(std::move(ptr));
    cout << "Ability added" << endl;
    cout << ability->GetName() << endl;
}

或者,你可以让Ability完成所有的构建/破坏。通常,创建对象的类应该是销毁它的类。

此外,这:

ability = NULL;
delete ability;

..可能倒退了。当您执行清理时,请务必撤消该顺序:

delete ability;
ability = NULL;

答案 1 :(得分:0)

您删除了该功能(因此指针不再指向任何内容)。在能力向量中,你有这个指针现在不指向任何东西。 所以,不要取消和删除指针。能力破坏应该由Ability析构函数完成。

是的,指针被复制到向量中,类似于0x455ff930,但请记住,当你删除它时,内存0x455ff930的位置(指针所指向的位置)是与能力无关。