如果我们在循环中创建对象会发生什么?

时间:2015-06-17 16:08:32

标签: c++

我的问题是,“如果我们在循环中创建对象会发生什么?”

示例:

<?php

    header ('Access-Control-Allow-Origin:*');

    $con= mysqli_connect ("localhost","root","","mycms");

    $query= mysqli_query ($con, "select * from posts ");

    $arr = array ();
    while ($r = mysqli_fetch_object($query)) {
        array_push($arr, array("post_id" => $r->post_id, "post_title" => $r->post_title, "post_author" => $r->post_author,
"post_image" => $r->post_image));
    }

    print_r(json_encode($arr));

?>

以及如何删除它们?

3 个答案:

答案 0 :(得分:5)

您编写的方式是,每次迭代都会在免费存储(堆)上创建一个新对象。您可能希望在循环结束时销毁对象:

for (int i = 0; i < iterations; i++)
{
    Foo* bar = new Foo(i); //here Foo(i) is a parameterized constructor
    // do stuff...
    delete bar;
}

或收集容器中的指针并在以后将其销毁:

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];
}

答案 1 :(得分:3)

内存泄漏。

首次迭代将创建一个bar对象,并为其分配所需的内存。下一次迭代(以及所有)bar的先前引用将丢失,并将分配新的内存引用。因此,您无法找到之前创建的bar

由于bar之前的所有引用都已丢失,因此您无法deletefree这些内存,因此Memory Leak

答案 2 :(得分:3)

  

如果我们在循环中创建对象会发生什么?[像这样]?

内存泄漏。

如果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;
}

更好的解决方案然而,(正如@ FatGiant所提到的)使用智能指针而不是哑指针来自动防止任何内存泄漏:

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