【发布时间】:2019-07-09 00:16:37
【问题描述】:
我只是在函数内部创建如下 Coordi 对象列表。 Coordi 是我定义的类对象。
list<Coordi> LstOfCoordi;
for (int i = 0; i < 10; ++i)
{
Coordi *tmp = new Coordi();
LstOfCoordi.push_back(tmp);
}
我想在程序终止之前将列表和每个对象释放到系统。
如果列表的每个元素都必须释放,如何处理?我尝试在下面的代码中使用删除它们中的每一个,但它产生了编译错误。
for (int i = 0; i < 10; ++i)
{
myClass tmp = LstOfMyCalss.back();
delete &tmp;
LstOfMyClass.pop_back();
}
所以,我想知道从列表中删除是否足够。 看下面的代码,每个元素都被分配了,当列表被销毁时,它们并没有被正确释放。
for (int i = 0; i < 10; ++i)
{
//myClass tmp = LstOfMyCalss.back();
//delete &tmp;
LstOfMyClass.pop_back();
}
请告诉我释放所有已分配对象的最佳方式。
【问题讨论】:
-
1.不要使用 C 风格的指针,那么你就不必担心这些事情了。 2.
myClass tmp =...; delete &tmp;始终是 UB。 3. 如果您真的需要代码方面的帮助,请提供minimal reproducible example。例如,我们不知道list是什么。 (是std::list吗?是你自己实现的吗?是你在使用的其他第三方类吗?) 4. 如果遇到编译错误,请与我们分享。 -
如果这是
std::list,您的列表不存储指针,它存储原始值,并且根本不应该使用new。您的编译器应该拒绝此代码(因为您试图将Coordi*存储在包含Coordi的list中)。最好的解决方案通常是根本不使用显式动态分配,而只是按值存储(在这种情况下不需要特殊清理;当列表被销毁时,它的内容会自动为您销毁)。 -
我知道,在现代 C++ 中,我们可以使用可用的库在
<memory>标头中使用智能指针,但是,人们声明:“不要使用原始或 C 样式指针”。我这样说是因为当我第一次学习 C++ 时没有智能指针,一切都是手动完成的,你必须了解内存、堆分配、指针算术、悬空指针和引用、内存管理、结构对齐、删除指针与删除指针数组、缓存和页面对齐等... -
@Max Vollmer,感谢您的建议。这是第一次问。我会记住你在其他问题上所说的话。