Mae*_*tro 1 c++ dynamic-memory-allocation stdset
如果我有一个容器,比如std::set指向动态对象的指针,那么我如何释放它的元素?
int main()
{
// new scope
{
int x = 10;
std::set<int*> spi;
spi.insert(new int(1));// elem is a dynamic object init from 1
spi.insert(new int[3]()); // elem is a dynamic array of 3 default-init integers
spi.insert(&x); // elem is address of stack memory object
}
}
Run Code Online (Sandbox Code Playgroud)
那么如何有效地释放具有动态内存的元素呢?
您必须遍历容器的内容并释放与每个元素对应的内存。
for ( auto ptr : spi )
{
delete [] ptr;
}
Run Code Online (Sandbox Code Playgroud)
但是,请记住,您发布的代码是有问题的。您不能delete获得通过使用addressof运算符获得的指针。如果您尝试调用delete容器的所有元素,以下行将导致下游出现问题。
spi.insert(&x);
Run Code Online (Sandbox Code Playgroud)
避免将此类混合指针放入容器中。您无法知道new使用addressof运算符分配了哪个元素以及使用运算符获取了哪个元素。
不仅如此,如果添加所获得的指针new int(10),并new int[3]在容器中,你会遇到不确定的行为无论你用delete或delete []在容器的elments。其中之一将是错误的。
我的建议是尝试编写干净的代码,而不是尝试寻找创造性的方法来处理写得不好的代码。
| 归档时间: |
|
| 查看次数: |
198 次 |
| 最近记录: |