C++ 带有指针参数的类函数未保存为vector
我不确定该如何命名,但基本上,我有一个类函数,它被设计为向类中的能力向量添加一个新的能力C++ 带有指针参数的类函数未保存为vector,c++,pointers,vector,C++,Pointers,Vector,我不确定该如何命名,但基本上,我有一个类函数,它被设计为向类中的能力向量添加一个新的能力 //Part of class Unit public: vector <Ability*> myAbilities; void AddAbility(Ability * ability) { myAbilities.push_back(ability); cout<<"Ability added"<<endl; cout<<abil
//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;
}
火球是一种能力的孩子
如何通过此函数向类能力的指针向量添加新能力?我敢肯定,通过引用来做这件事毫无意义,而且有可能我只是忘记了一些基本的东西,但我似乎无法准确指出它。你删除了这个能力(因此指针不再指向任何东西)。在能力向量中,这个指针现在不指向任何东西。
因此,不要取消并删除指针。能力毁灭应该由能力毁灭者来完成
指针是用向量复制的,如“代码>0x45 5ff930”,但请记住,当删除它时,内存<代码> 0x45 5ff930< /COD>(这是指针指向的)不再与能力相关。 < P>如果您正在编译C++ 11,请考虑使用并让系统处理内存管理: 根据Casper Von B下面的评论,
unique\u ptr
似乎更适合您的特殊情况(更新):
。。很可能是倒退。执行清理时,请确保颠倒顺序:
delete ability;
ability = NULL;
为什么要在删除之前将
能力
置零?我很确定,当函数完成时,参数中的指针基本上消失了——指针被复制到向量,因此在这方面不会丢失数据。您必须做其他事情才能得出对象“不存在”的结论。在这种情况下,所有权似乎是独占的,因此unique_ptr更适合。可以在空指针上调用delete。该标准明确规定,delete a_null_ptr
不会导致运行时错误。然而,在他的代码中最有可能发生的是内存泄漏。实际上,free
和delete
运算符允许null,在标准中定义为no-op。如果在删除某个内容之前将其置空,那么在大多数情况下,您当然会泄漏内存。此外,如果我们就现代实践提供建议,nullptr
代替null
。我的错误是,我把delete
ingnull
和doubledelete
s:)好吧,我在通过指针时确实找不到任何东西,但我现在怎么看,这个能力变成了一个新的火球,当你有了新的实例,您应该在完成后清理它,因为它是一个参数,所以当函数完成时它将消失。那么,我为什么不在函数末尾删除它呢?
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 = NULL;
delete ability;
delete ability;
ability = NULL;