C++ 基于距离的For循环

C++ 基于距离的For循环,c++,for-loop,heap,C++,For Loop,Heap,我的问题是:当我使用这个例子中基于范围的for循环时,它是否会释放存储在“vec”中的每个“对象”的堆上的内存?我认为这只是复制一个指针,然后试图释放复制的指针 我相信“auto*&obj:vec”是将“obj”声明为指针的引用,然后将存储在“vec”中的每个对象的地址分配给它,它的内存将被释放,并设置为null ptr。是这样吗 std::vector <Object*> vec; vec.push_back(new Object{}); vec.push_back(new Obj

我的问题是:当我使用这个例子中基于范围的for循环时,它是否会释放存储在“vec”中的每个“对象”的堆上的内存?我认为这只是复制一个指针,然后试图释放复制的指针

我相信“auto*&obj:vec”是将“obj”声明为指针的引用,然后将存储在“vec”中的每个对象的地址分配给它,它的内存将被释放,并设置为null ptr。是这样吗

std::vector <Object*> vec;
vec.push_back(new Object{});
vec.push_back(new Object{});
//....

//clean up
for(auto *& obj : vec)
    delete obj, obj = nullptr;
std::向量向量向量机;
向量推回(新对象{});
向量推回(新对象{});
//....
//清理
用于(自动*&obj:vec)
删除obj,obj=nullptr;
这应该行得通

这应该行得通

当我使用基于范围的for循环(如本例中所示)时,它是否会释放存储在“vec”中的每个“对象”的堆上的内存

我认为这只是复制一个指针,然后试图释放复制的指针

它不会复制指针。但是,删除指针的副本与删除指针的操作相同,因此,删除指针的副本与删除指针的对象是否销毁没有区别。在删除后的赋值中,是否将原始指针设置为null确实有区别

我相信“auto*&obj:vec”是将“obj”声明为指针的引用,然后将存储在“vec”中的每个对象的地址分配给它,它的内存将被释放,并设置为null ptr。是这样吗

std::vector <Object*> vec;
vec.push_back(new Object{});
vec.push_back(new Object{});
//....

//clean up
for(auto *& obj : vec)
    delete obj, obj = nullptr;
这基本上是正确的。尽管如此,如果我们是学究,该代码将存储在
vec
中的每个对象分配给引用。这是因为存储在
vec
中的对象是
对象
实例的地址

您需要澄清代码的功能,这意味着它不是很好。在这种情况下,您可能会受益于不使用
auto

for(Object*& obj : vec) {
    delete obj;
    obj = nullptr;
}

也可以考虑是否存储一个空指针向量。我建议您不要将指针设置为null,只需完全删除指针:

for(Object* obj : vec)
    delete obj;
vec.clear();
更清楚,不是吗

当我使用基于范围的for循环(如本例中所示)时,它是否会释放存储在“vec”中的每个“对象”的堆上的内存

我认为这只是复制一个指针,然后试图释放复制的指针

它不会复制指针。但是,删除指针的副本与删除指针的操作相同,因此,删除指针的副本与删除指针的对象是否销毁没有区别。在删除后的赋值中,是否将原始指针设置为null确实有区别

我相信“auto*&obj:vec”是将“obj”声明为指针的引用,然后将存储在“vec”中的每个对象的地址分配给它,它的内存将被释放,并设置为null ptr。是这样吗

std::vector <Object*> vec;
vec.push_back(new Object{});
vec.push_back(new Object{});
//....

//clean up
for(auto *& obj : vec)
    delete obj, obj = nullptr;
这基本上是正确的。尽管如此,如果我们是学究,该代码将存储在
vec
中的每个对象分配给引用。这是因为存储在
vec
中的对象是
对象
实例的地址

您需要澄清代码的功能,这意味着它不是很好。在这种情况下,您可能会受益于不使用
auto

for(Object*& obj : vec) {
    delete obj;
    obj = nullptr;
}

也可以考虑是否存储一个空指针向量。我建议您不要将指针设置为null,只需完全删除指针:

for(Object* obj : vec)
    delete obj;
vec.clear();


更清楚,不是吗?

这不是清理向量的方法。它有自己的机制。你真的需要指针向量吗?使用RAIII如果你使用对象而不是指针,一旦向量超出范围,它们就会自动被清除,或者你调用向量的清空函数。我觉得你的代码不错。从文体学的角度来看,我宁愿使用<代码> {删除Obj.Obj= nulLpTR;} /Cult>。如果有基于范围的,则有STD::UnQuyQPTR,并且应该考虑使用它。您需要从类型层次结构中存储多个类型的指针。这不是如何清理向量。它有自己的机制。你真的需要指针向量吗?使用RAIII如果你使用对象而不是指针,一旦向量超出范围,它们就会自动被清除,或者你调用向量的清空函数。我觉得你的代码不错。从文体学的角度来看,我宁愿使用<代码> {删除Obj.Obj= nulLpTR;} /Cult>。如果有基于范围的,则有STD::UnQuyJPTR,并且应该考虑使用它。您需要从类型层次结构中存储多个类型的指针。<代码> Pt= NulLPTR;<代码>部分不做任何有用的事情。它不会自动设置为NulLPTR(不是我所能说的C++标准的一部分)。有一个指向内存的非空指针向量从来都不是一个好主意,内存已经被清除,可以被其他代码位重用。这都是真的,但是你将一个函数局部变量设置为
nullptr
vec
仍然包含
delete
d指针。好的一点:),我错过了。那么,除了不回答问题和包含错误(正如R Sahu所指出的)之外,还有一个指向指针的引用。老实说:你真的认为这比OP的解决方案好吗部分不做任何有用的事情。它不会自动设置为NulLPTR(不是我所能说的C++标准的一部分)。有一个指向内存的非空指针向量从来都不是一个好主意,内存已经被清除,可以被其他代码位重用。这都是真的,但是你将一个函数局部变量设置为
nullptr
vec
仍然包含
delete
d指针。好的一点:),我错过了。那么,除了不回答问题和包含错误(正如R Sahu所指出的)之外,还有一个指向指针的引用。老实说:你真的认为这比OP的解决方案好吗?是的,是的。谢谢你,是的。非常感谢。