在循环-C 中重新删除对象

Re-declaring object in a for loop - C++

本文关键字:删除 对象 新删除 循环      更新时间:2023-10-16

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)确实共享相同的名称,但在范围内无重叠。一切都很好。