c++ - 这个类的析构函数是什么样的?

标签 c++

class Equipment
{
    std::vector<Armor*> vEquip;
    Weapon* mainWeapon;
    int totalDefense;
    int totalAttack;

public:

    unsigned int GetWeight();

    int * GetDefense();

    bool EquipArmor(Armor* armor);
    bool UnequipArmor(Armor* armor);

    bool EquipWeapon(Weapon* wep);
    bool UnequipWeapon(Weapon* wep);

    Equipment();
    virtual ~Equipment();
};

看来不应该有析构函数。指针 vector 在超出范围时会自行处理,指针指向的实际对象不需要删除,因为会有其他引用指向它。

这里的所有对象都是指主容器:

class Container
{
    int weightLimit;
    unsigned int currWeight;
    std::vector<Item*> vItems;

public:

    bool AddItem(Item* item);
    bool RemoveItem(Item* item);

    Container();
    Container(int weightLim);
    Container(int weightLim, std::vector<Item*> items);
    ~Container();
};

现在我可以看到有必要删除容器中的所有对象,因为这是通过 AddItem(new Item("Blah")) 分配所有对象的地方

(盔甲和武器继承自元素)

最佳答案

非指针类型会照顾好自己。因此,整数、 float 、对象等会自行处理,您不必担心删除它们。

任何由该类管理的指针都需要被该类的析构函数删除。因此,如果指针指向的内存是在类中分配的,或者如果它是本着由类管理它的想法提供给类的,那么析构函数需要删除指针。

如果指针指向另一个类正在管理的内存,那么您显然不希望析构函数删除它。这是负责该指针指向的内存的类的工作。

标准容器管理它们持有的指针(如果它们持有指针)。所以,如果你有一个指针容器,无论哪个类应该管理它们都需要删除它们。很可能这是保存容器的类,但这取决于您的代码在做什么。

因此,通常情况下,对于具有指针容器的类,您需要在析构函数中使用如下内容:

for(containerType<T*>::iterator iter = container.begin(),
                                end  = container.end();
    iter != end;
    ++iter)
{
    delete *iter;
}

每个分配有内存的指针都必须有一些东西(通常是一个类,但有时是分配它的函数)有效地拥有该内存并确保它被释放。当谈论类时,通常是分配内存的同一个类,但当然,一个类或函数很可能分配内存,然后有效地将内存的所有权传递给另一个类或函数。无论如何,无论谁“拥有”内存,都需要清理它。这就是您的析构函数需要担心的事情:清除该类拥有的所有资源。

关于c++ - 这个类的析构函数是什么样的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2716041/

相关文章:

c++ - 为什么仅当我在 SDL2 中设置非零 alpha 大小时才获得 sRGB 帧缓冲区?

c++ - 文件作为命令行参数

c++ - 在 header 中定义全局数组的模板技巧

android - 无法执行 JavaVM->DetachCurrentThread() : "attempting to detach while still running code"

c# - C++/C# Python 钩子(Hook)

c++ - 复合赋值中关于 `const` 的困惑

c++ - __vfptr 表在未删除的对象中损坏

c++ - 海湾合作委员会错误 : expected primary-expression before ')' token with MSVC C++ code

c++ - 如何在 C++ 的 map 映射中使用 cout 探测特定值

c++ - 为什么谷歌测试 ASSERT_FALSE 在方法中不起作用,但 EXPECT_FALSE 可以