[英]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]
不存在。 argv
有argc
值,因此最后一个将是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.