销毁带有变量的对象(释放内存)
Destroy an object with variables (free memory)
我试图在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或其他组件只是将先前分配的内存标记为空闲,而没有"物理地"删除先前存储在那里的数据。这可能就是为什么你可以从删除的指针中访问以前的数据。但这只是未定义行为,这是并不是保证在其他上下文中工作,与其他版本的编译器或运行时库实现等。所以,只要修改你的代码,不要那样做
- 如何在c++中释放内存
- 为什么这个 std::queue/指向结构的指针列表直到 List.Size() == 0 才释放内存?
- std::unordered_map析构函数不释放内存?
- 在C++中释放内存期间,迭代器与指针有何不同
- 使用共享指针时,从共享指针本身释放内存的机制是什么
- 释放内存(主题模板)时出现问题
- 使用后自动释放内存
- C++ 如何释放内存
- 从函数内对象的向量中释放内存
- C++ 在不释放内存的情况下调用析构函数
- 多个线程之间的获取-释放内存顺序
- C++ - 析构函数只是释放内存还是实际删除对象
- 使用 RAII 替换最终块以释放内存
- 如何通过带有指向基类的指针的删除运算符释放内存
- 代码中的"sprintf"用法是否需要释放内存?
- C++何时使用 delete[] 并正确释放内存?
- 为什么此获取和释放内存围栏不能给出一致的值?
- 抛出新表达式的参数子表达式时释放内存
- 在这种情况下,如何释放内存?
- 在 c++ 中应按什么顺序释放内存?