繁体   English   中英

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

[英]program appears to continue running after exit (0)

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

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]前进1,然后打开下一个文件。 它应该在尝试打开不存在的文件之前退出。

该函数将正常工作,直到到达最后一个文件为止,此时将引发调试断言。

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 << "\n\n";
        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]不存在。 argvargc值,因此最后一个将是argv[argc-1]

实际上,设置main() argv参数的方式, argv[argc]将返回nullptr file_handler()此参数是std::string ,尝试从nullptr构造std::string会引发您的断言。

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

然后,使用n == argc

file_handler ( file , argv [n] , 1 )

…相当于

file_handler ( file , 0 , 1 )

…其中0用来初始化std::string形式参数,这是非常不好的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM