void main(){
try {
GameEntry deletedItem = newList.remove(13);
}
catch (IndexOutOfBound &e) {
cout << e.what() << endl;
}
cout << ":)";
}
在此源代码中,在catch()
处理错误后,main函数成功地放入&#34; :)&#34;,但未知错误发生在main()
函数的结束行。
我知道如何通过在exit(0)
之后添加cout << ":)"
来解决此错误,但我不知道原因。
关于错误处理,return
和exit
之间是否有任何区别?当我使用int main()
阻止时,是否必须使用void main()
,而不是try catch
?
[解决] 我发现类的析构函数中存在错误。
答案 0 :(得分:0)
处理此错误与main的返回类型无关。它应始终为int main()
。
return
和exit()
之间的差异:
return
为您的范围变量调用析构函数exit()
除静态变量所以你应该仔细使用exit()
。
答案 1 :(得分:0)
我知道如何通过在cout&lt;&lt;之后放置exit(0)来修复此错误“:)”
这不能解决错误 该错误只是隐藏,因为导致错误的代码没有运行。
当您致电exit()
时,它不会从通话中返回。这意味着堆栈不会展开,因此不会破坏本地对象。这表明你有一个本地对象的析构函数的bug。
不幸的是,您没有显示任何对象,因此很难告诉您错误是什么。
void main(){
// You have some variables declared here.
// That get destroyed when main() exists (ie there destructors run).
// This is where you bug is.
// calling exit() after the last line below will hide this error
// as the destructor for these objects will not be run.
try {
GameEntry deletedItem = newList.remove(13);
}
catch (IndexOutOfBound &e) {
cout << e.what() << endl;
}
cout << ":)";
}
关于错误处理的返回和退出之间是否有任何区别?
唯一的主要区别是自动变量不会被销毁(因为退出不会返回,因此堆栈不会被解开)。其他一切都是一样的。
当我使用try catch块时,是否必须使用int main(),而不是void main()?
使用void main()
无效。
程序的唯一有效版本有一个声明如下:
int main()
或
int main(int argc, char* argv[]) // or equivalent types.
任何其他声明都是非标准的(虽然允许)。
注意:
6.8.3.1主要功能
是一种实现方式
1:程序应包含一个名为main的全局函数。执行程序启动一个主要执行线程,其中调用main函数,并且可以初始化和销毁静态存储持续时间的变量。实现定义是否需要独立环境中的程序来定义主要功能 2:实现不应预定义主函数。此功能不应过载。它的类型应具有C ++语言链接,并且它应具有int类型的声明返回类型,否则其类型是实现定义的。- ()返回int和
的函数- 返回int
的函数(int,指向char的指针)3:函数main不得在程序中使用。 main的链接是实现定义的。将main定义为已删除或将main声明为内联,静态或constexpr的程序是不正确的。主函数不应使用链接规范声明。在全局范围内声明变量main或使用C语言链接(在任何命名空间中)声明名称main的程序是不正确的。名称main不以其他方式保留。