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

Destroy an object with variables (free memory)

我正在尝试用 C++ 创建一个 event/date 管理器。 概述就像一个日历显示一个月,这个日历中的每一天都是一个对象(类型:EventCell) class EventCell 将他一天的事件存储在一个向量中(名称:eventData 类型:"EventInfo":class 用于存储日期,名称,start/endtime)。

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

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

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

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

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

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

有什么建议我可以实际删除一个对象及其变量等以取回内存并创建一个新的吗?

I still get the value of the Variable from the deleted object...

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

Any suggestions how I could actually delete an object with its variable etc to get back the memory and create an new?

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

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

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

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

另请注意,您可能还希望有一个更简单的 vector<YourData>

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

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