我的问题是,“如果我们在循环中创建对象会发生什么?”
示例:
<?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));
?>
以及如何删除它们?
答案 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
之前的所有引用都已丢失,因此您无法delete
或free
这些内存,因此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