程序在退出(0)后似乎继续运行

program appears to continue running after exit (0)

本文关键字:继续 运行 退出 程序      更新时间:2023-10-16

在运行时,程序从命令行获取一个或多个参数,每个参数都是要打开的文件名。

argc ==文件名的个数

argv[0] ==程序名

argv[n],其中n是一个整数==一个给定的文件名,根据它们从命令行传递的顺序。

next_file进入下一个要编辑的文件。它增加n,并在n大于argc时退出;因为这意味着最后一个文件已经被访问过了。否则,它将调用file_handler。

file_handler接受一个流对象[file]、一个字符串[name]和一个布尔变量[open]。如果open为0,则关闭当前文件。如果open为1,则以[file]打开[name]。

当调用next_file时,预期的行为是关闭当前打开的文件,将[n]向前推进一个,然后打开下一个文件。在尝试打开一个不存在的文件之前,它应该退出。

函数正常工作,直到到达最后一个文件,此时抛出调试断言。

void next_file ( int & n , int argc , char *argv [] , fstream & file )
{
    n++;
    if ( n > argc )
        exit ( 0 );
    file_handler ( file , argv [n - 1] , 0);
    file_handler ( file , argv [n] , 1 ); //this appears to be the cause of the assertion failure
}
void file_handler ( fstream & file , string name , bool open )
{
    if ( open == 0 )
    {
        file.close ();
        file.clear ();
        return;
    }
    in.open ( name , ios::in | ios::out | ios::binary );
    if ( !in.is_open () )
    {
        cout << "n Failed opening " << name << "nn";
        exit (0);
    }
}

你跑到数组的末尾了

如你所知,当一个数组有n个元素时,它们的值是array[0]array[n-1]

n++;
if ( n > argc )
    exit ( 0 );

在这一点上,n的最高可能值是argc,因为如果n > argc, exit(0)被调用。但是当n等于argc时,这个会继续。因此:

file_handler ( file , argv [n] , 1 ); //this appears to be the cause of the assertion failure

当然这将是断言的原因。这里n的最大值将是argc,如上所述。

当然,argv[argc]不存在。在argv中有argc的值,因此最后一个将是argv[argc-1]

实际上,设置argv参数给main()的方式,argv[argc]将返回一个nullptrfile_handler()的参数是一个std::string,试图从nullptr构造一个std::string将引发assert。

对于main参数,argv[argc]的值保证为0。

Then,用n == argc

file_handler ( file , argv [n] , 1 )

白马王子;相当于

file_handler ( file , 0 , 1 )

白马王子;其中0用于初始化std::string形式参数,这是相当不好的。