C++ 如果我们在循环中创建对象会发生什么?
我的问题是,“如果我们在循环中创建对象会发生什么?” 例如:C++ 如果我们在循环中创建对象会发生什么?,c++,C++,我的问题是,“如果我们在循环中创建对象会发生什么?” 例如: for (int i = 0; i < iterations; i++) { Foo* bar = new Foo(i); //here Foo(i) is a parameterized constructor } for(int i=0;i
for (int i = 0; i < iterations; i++)
{
Foo* bar = new Foo(i); //here Foo(i) is a parameterized constructor
}
for(int i=0;i
如何删除它们?内存泄漏
第一次迭代将创建一个bar
对象,并为其分配所需的内存。下一次迭代(以及所有)之前对条的引用将丢失,并将分配一个新的内存引用。因此,您无法找到以前创建的栏
由于先前对条的所有引用均已丢失,您无法删除或释放这些内存,因此
如果我们在循环中创建对象[像这样],会发生什么
内存泄漏
如果bar
超出范围,则无法删除它们(在循环体的末尾就是这样)
如何删除它们
您需要对象的地址才能删除它们。如果需要在循环外删除它们,则必须在循环外存储它们的地址:
std::vector<Foo*> fooPointers;
fooPointers.reserve(iterations);
for (int i = 0; i < iterations; i++)
{
Foo* bar = new Foo(i);
fooPointers.push_back(bar);
}
for (Foo* p : fooPointers)
{
delete p;
}
for (int i = 0; i < iterations; i++)
{
Foo* bar = new Foo(i); //here Foo(i) is a parameterized constructor
// do stuff...
delete bar;
}
std::向量指针;
fooPointers.reserve(迭代);
对于(int i=0;i
但是,更好的解决方案是(如@所述)使用智能指针而不是哑指针来自动防止任何内存泄漏:
std::vector<std::unique_ptr<Foo>> fooPointers;
fooPointers.reserve(iterations);
for (int i = 0; i < iterations; i++)
{
fooPointers.push_back(std::unique_ptr<Foo>(new Foo(i)));
Foo& bar = *fooPointers.back();
}
fooPointers.clear(); // calls delete on all Foos, note that this step is optional
std::向量指针;
fooPointers.reserve(迭代);
对于(int i=0;i
按照您编写的方式,每次迭代都在空闲存储(堆)上创建一个新对象。您可能希望在循环结束时销毁对象:
std::vector<Foo*> fooPointers;
fooPointers.reserve(iterations);
for (int i = 0; i < iterations; i++)
{
Foo* bar = new Foo(i);
fooPointers.push_back(bar);
}
for (Foo* p : fooPointers)
{
delete p;
}
for (int i = 0; i < iterations; i++)
{
Foo* bar = new Foo(i); //here Foo(i) is a parameterized constructor
// do stuff...
delete bar;
}
for(int i=0;i
或者在容器中收集指针并稍后销毁:
std::vector<Foo*> v;
for (int i = 0; i < iterations; i++)
{
Foo* bar = new Foo(i); //here Foo(i) is a parameterized constructor
v.push_back(bar);
}
// do stuff...
for(size_t i = 0; i < v.size(); ++i)
{
delete v[i];
}
std::vector v;
对于(int i=0;i
最好使用智能指针作为内存management@FatGiant我只是问一些知识。如果我这样做会怎么样?我们真的需要知道更多关于你想做什么的信息。这毫无意义。你为什么要这样做?你想解决什么问题吗?哇,那真的很有帮助。顺便问一下,如果我在每次迭代结束时不删除对象,会发生什么?如果不删除对象,就会泄漏内存。如果在释放内存之前抛出异常,智能指针仍然会发生内存泄漏