销毁带有变量的对象(释放内存)

Destroy an object with variables (free memory)

本文关键字:释放 内存 对象 变量      更新时间:2023-10-16

我试图在c++中创建一个事件/日期组织者。概述就像一个日历显示一个月,日历中的每一天都是一个对象(类型:EventCell)。类EventCell将一天的事件存储在一个向量中(名称:eventData,类型:"EventInfo":类用于存储日期,名称,开始/结束时间)。

但是当我切换月份时,我想要清除这个向量,销毁它的所有对象并释放它的变量的内存。我试过了:

for (unsigned int i = 0; i < terminData.size(); i++)
{
    delete terminData[i];
}
terminData.clear();

它调用了解构器,但是变量等仍然存在。例如:

terminData[0]->getDay(); 
result: 3

我仍然从删除的对象中获得变量的值…

我想如果我不删除所有内容,它可能会变得很大,因为每次我更改月份,它都会为每个事件创建一个对象。

任何建议,我如何可以实际删除一个对象与它的变量等,以获得内存和创建一个新的?

我仍然从删除的对象中获得变量的值…

不,你得到一个垃圾值。通过在terminData.clear();之后访问terminData[0],您调用了未定义的行为。

任何建议,我如何可以实际删除一个对象与它的变量等,以获得内存和创建一个新的?

您已经成功删除了对象。要创建新对象,请像创建原始对象一样构造它们。旧对象的内存可以被其他对象使用

而不是在向量中存储原始的拥有指针,因为您的代码显式删除调用使我认为:

for (unsigned int i = 0; i < terminData.size(); i++)
{
    delete terminData[i];
}

我将只使用智能指针的向量,例如vector<unique_ptr<YourData>>。在这种情况下,一个简单的terminData.clear()调用将自动地删除指向对象。

请注意,您可能也想要一个更简单的vector<YourData>

引用已删除的内存并得到看起来有效的结果并不意味着你的代码是正确的,或者内存也没有被正确删除。引用已删除的内存是未定义行为,所以不应该这样做。

可能内存分配器或CRT或其他组件只是将先前分配的内存标记为空闲,而没有"物理地"删除先前存储在那里的数据。这可能就是为什么你可以从删除的指针中访问以前的数据。但这只是未定义行为,这是并不是保证在其他上下文中工作,与其他版本的编译器或运行时库实现等。所以,只要修改你的代码,不要那样做