使用变量销毁对象(可用内存)

时间:2015-06-04 10:40:39

标签: c++ object memory free

我正在尝试用C ++创建一个事件/日期组织器。 概述就像一个月份的日历显示,这个日历中的每一天都是一个对象(类型:EventCell) EventCell类将他当天的事件存储在一个向量中(name:eventData,类型为:“EventInfo”:用于存储日期,名称,开始/结束时间的类)。

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

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

它调用解构函数,但变量等仍然存在。 如果我这样做:

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

我仍然从已删除的对象中获取变量的值...

我认为如果我不删除它可能变得很大的一切,因为每次我更改月份时,都会为每个事件创建一个对象。

有什么建议我如何用变量等删除一个对象以获取内存并创建一个新的?

2 个答案:

答案 0 :(得分:4)

  

我仍然从已删除的对象中获取变量的值...

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

  

有什么建议我如何用变量等删除一个对象以获取内存并创建一个新的?

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

答案 1 :(得分:1)

而不是将原始拥有指针存储在向量中,因为具有显式删除调用的代码让我想到:

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

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

另请注意,您可能希望更简单vector<YourData>

您引用已删除的内存并获得可能显示为有效结果的事实并不意味着您的代码是正确的,或者内存未被正确删除。引用已删除的内存是未定义的行为,因此您不应该这样做。

内存分配器或CRT或某些其他组件可能只是将先前分配的内存标记为空闲,而没有&#34;物理上&#34;删除以前存储在那里的数据。因此,这可能是您可以从已删除指针访问先前数据的原因。但这只是未定义的行为,这是保证在其他上下文中工作,与其他版本的编译器或运行时库实现等等。所以,只需修复你的代码,不要这样做。