Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 带有指针参数的类函数未保存为vector_C++_Pointers_Vector - Fatal编程技术网

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
ing
null
和double
delete
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;