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

Class function with a pointer parameter not saving to vector

本文关键字:保存 向量 类函数 指针 参数      更新时间:2023-10-16

我不知道该如何命名,但基本上,我有一个类函数,它旨在为类中的能力向量添加一个新的能力。

//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;
}

我非常确信,当函数完成时,参数中的指针基本上会消失,当我试图在主函数中输出能力名称时,它不存在。我更喜欢使用这个功能:

AddAbility(new Fireball());

火球是一个儿童班的能力。

如何通过这个函数将新的能力添加到指向类ability的指针向量中?我很确定通过引用来做这件事是没有意义的,我可能只是忘记了一些基本的东西,但我似乎无法准确定位。

如果使用C++11进行编译,请考虑使用共享指针,并让系统处理内存管理:

根据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;

您删除了该功能(因此指针不再指向任何内容)。在能力向量中,你有一个指针,它现在不指向任何东西。所以,不要取消和删除指针。能力销毁应该由能力销毁器完成。

是的,指针被复制到向量中,就像0x455ff930一样,但请记住,当您删除它时,内存0x455ff930的位置(指针指向的位置)不再与能力相关。