在循环-C 中重新删除对象
Re-declaring object in a for loop - C++
i确实有一个关于循环中可变重新解释的问题。
为什么在foor循环中声明一个对象不会触发重新支配错误?
在循环的每次迭代中,对象是否会被破坏和重新创建?
我正在插入示例代码
class DataBlock {
int id;
string data;
public:
DataBlock(int tid=0,const string &tdata=""){
id=tid;
data=tdata;
}
}
int main(int argc, char *argv[]){
ifstream file;
int temp_id; //temporary hold the the id read from the file
string temp_data; //temporary hold the data read from the file
set <DataBlock> s;
//check for command line input here
file.open(argv[1]);
//check for file open here
file >> temp_id >> temp_data;
while (!file.eof()){
DataBlock x(temp_id,temp_data); //Legit, But how's the workflow?
s.insert(x);
file >> temp_id >> temp_data;
}
file.close();
return 0;
}
为什么在foor循环中声明一个对象不会触发重新支配错误?
当您在同一范围内两次(或更多(声明相同名称(或更多(时,会发生重新分支错误。看起来像
int i = 5;
int i = 6; // uh oh, you already declared i
在您的循环中,您没有,您只有
loop
{
int i = 5;
}
所以没有重新支撑。
您也可以拥有
int i = 5
{
int i = 6;
std::cout << i;
}
并且没有重新分支误差,因为变量在不同的范围内,并且您可以在多个范围中具有相同的变量。i这种情况6
将被打印,因为i
是范围中的i
。
在循环的每次迭代中,对象是否会被破坏和重新创建?
是。将循环视为多次调用的函数。当您输入循环/函数的主体时,声明中声明的变量将构造 1 ,当您到达循环/函数的末端时,变量被破坏了。
1:它比这要复杂一点,但是我们不需要在此答案中介绍所有这些细节
为什么在foor循环中声明一个对象不会触发重新支配错误?
不,它没有。
每次循环迭代时,都会输入一个新的范围,并且在上一个中创建的对象被破坏并释放其存储分配。
for (int i=0 ; i<2 ; ++i) {
MyClass c;
}
将好像:
{
int i=0;
{
MyClass c; // c(0)
} // c destructed, storage allocation freed
++i;
{
MyClass c; // c(1)
} // c destructed, storage allocation freed
++i;
}
c(0)
和 c(1)
确实共享相同的名称,但在范围内无重叠。一切都很好。
相关文章:
- 迭代时从向量和内存中删除对象
- C++从对象自己的类中删除对象
- 如何通过对象的类属性删除对象,并返回其对象值?
- 删除对象(具有不同类型)的引用时会发生什么情况?
- 从列表C++中删除对象
- c++ 循环访问对象列表并删除对象
- 从对象本身的容器中删除对象
- 从尝试引用已删除函数的矢量 C++ 中删除对象
- 如何通过指向元组的共享指针删除对象
- 防止通过接口删除对象
- 在 c++ 中从内存中删除对象
- 当对象被删除时,复制被删除对象的对象如何
- 当我使用dynamic_cast并删除对象删除时,析构函数是如何工作的?
- 从内存中删除对象
- 通过C++中的删除方法自行删除对象
- C++ - 析构函数只是释放内存还是实际删除对象
- 如何通过存储在 std::list 中的指针删除对象?
- 如何通过对象参数从指针矢量中删除对象和指针
- 我可以删除对象的右值版本的函数吗?
- 使用对象的索引从矢量中删除对象