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我只是问一些知识。如果我这样做会怎么样?我们真的需要知道更多关于你想做什么的信息。这毫无意义。你为什么要这样做?你想解决什么问题吗?哇,那真的很有帮助。顺便问一下,如果我在每次迭代结束时不删除对象,会发生什么?如果不删除对象,就会泄漏内存。如果在释放内存之前抛出异常,智能指针仍然会发生内存泄漏