关于错误处理的main()末尾的C ++错误

时间:2018-04-09 14:28:48

标签: c++ exception-handling

void main(){
    try {
        GameEntry deletedItem = newList.remove(13);
    }
    catch (IndexOutOfBound &e) {
        cout << e.what() << endl;
    }
    cout << ":)";
}

在此源代码中,在catch()处理错误后,main函数成功地放入&#34; :)&#34;,但未知错误发生在main()函数的结束行。 我知道如何通过在exit(0)之后添加cout << ":)"来解决此错误,但我不知道原因。 关于错误处理,returnexit之间是否有任何区别?当我使用int main()阻止时,是否必须使用void main(),而不是try catch

[解决] 我发现类的析构函数中存在错误。

2 个答案:

答案 0 :(得分:0)

处理此错误与main的返回类型无关。它应始终为int main()

returnexit()之间的差异:

  • 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不以其他方式保留。