gpt4 book ai didi

c++ - 如何避免多态和 vector 的内存泄漏?

转载 作者:行者123 更新时间:2023-11-30 03:25:50 24 4
gpt4 key购买 nike

早上好

我正在开发一个使用多态性的 C++ 应用程序,我想要一些建议以避免内存泄漏。请参阅下面的代码:

class IItem
{
public:
IItem(){}
virtual void Init() = 0;
virtual ~IItem(){}
};

class ItemA : public IItem
{
private:
int m_a;

public:
ItemA(){ m_a = 0; }
void Init(){m_a = 10;}
virtual ~ItemA(){}
};


class Element
{
public:
int m_a;
int m_b;
IItem* m_pItem;

Element(){}
void Init(IItem* item)
{
m_pItem = item;
}
virtual ~Element(){}
};

class ItemInfo
{
public:
int m_id;
std::string m_name;
Element m_element;

public:
ItemInfo(){}
virtual ~ItemInfo(){}
};

class Test
{

public:
Test(){}
virtual ~Test(){}

void Initialize(std::vector<ItemInfo>* arrayItem)
{
for(int i=0;i<5;i++)
{
arrayItem->push_back(ItemInfo());
arrayItem->back().m_element.Init(new ItemA());
}
}
};

我用这一行调用主程序:

Test test;
std::vector<ItemInfo> arrayItemInfo;
test.Initialize(&arrayItemInfo);

在函数 Initialize 中,我正在使用“new ItemA”,我的问题是如何删除内存属性?

预先感谢您的帮助。

最佳答案

如果可以,请使用 std::unique_ptr<> 而不是普通指针(*):

class Element
{
public:
std::unique_ptr<IItem> m_pItem;

Element(){}
void Init(IItem* item)
{
m_pItem.reset(item);
}
virtual ~Element(){}
};

请注意,在这种形式下,您的类变得不可复制(因为 std::unique_ptr 已经删除了复制语义)。如果这是一个限制,您可以:


(*) 当然,您需要使用 new 创建对象(和你一样),因为 std::unique_ptr 的默认删除器简单 delete是指针。如果您想要不同的行为,您可以提供自定义删除器。


如果您不能使用 C++ 11 功能,最简单的方法是在析构函数中手动处理内存管理:

class Element
{
public:
IItem* m_pItem;

Element(IItem* item)
: m_pItem(item)
{ }

virtual ~Element()
{
delete m_pItem;
m_pItem = NULL;
}
};

class ItemInfo
{
public:
int m_id;
std::string m_name;
Element m_element;

public:
ItemInfo(IItem* item)
: m_element(item)
{ }
virtual ~ItemInfo()
{}
};

我还更新了代码以通过构造函数使用初始化而不是丑陋的 Init/Release - 喜欢界面。现在,使用这段代码,您的循环变得更好:

void Initialize(std::vector<ItemInfo>* arrayItem)
{
for(int i = 0; i < 5; i++)
{
arrayItem->push_back(ItemInfo(new ItemA()));
}
}

但是请注意,您需要提供适当的复制语义以避免多次删除同一对象(或简单地禁用复制)。

另一种方法可能是查看 std::auto_ptr<> ,但由于它现在已被弃用(从 C++ 11 开始),我建议避免使用它。

顺便一提 - virtual Element 中的析构函数, ItemInfoTest您发布的代码中不需要类。

关于c++ - 如何避免多态和 vector 的内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48767972/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com