【问题标题】:C++ Error at end of the main() regarding Error Handling关于错误处理的 main() 末尾的 C++ 错误
【发布时间】:2018-04-09 14:28:47
【问题描述】:
void main(){
    try {
        GameEntry deletedItem = newList.remove(13);
    }
    catch (IndexOutOfBound &e) {
        cout << e.what() << endl;
    }
    cout << ":)";
}

在此源码中,在catch()处错误处理后,main函数成功放入“:)”,但main()函数的结尾行出现未知错误。 我知道如何通过将exit(0) 放在cout &lt;&lt; ":)" 之后来解决此错误,但我不知道原因。 returnexit 在错误处理方面有什么区别吗?当我使用try catch 块时,我是否必须使用int main(),而不是void main()

[已解决] 发现类的析构函数出错了。

【问题讨论】:

  • 您必须始终使用int main
  • 是的,你必须使用int main(...),但它不会导致崩溃(我猜是崩溃了?)。没有 MCVE,不知道崩溃的原因是什么。
  • GameEntryIndexOutOfBoundnewList 的任何类型中的一个或多个中存在一个或多个错误。
  • 发现类的析构函数有错误。

标签: c++ exception-handling


【解决方案1】:

我知道如何通过将 exit(0) 放在 cout 之后来解决此错误

这并不能修复错误。
错误只是隐藏了,因为导致错误的代码没有运行。

当您调用 exit() 时,它不会从调用中返回。这意味着堆栈不会展开,因此本地对象不会被破坏。这表明您的本地对象之一的析构函数存在错误。

很遗憾,您没有显示任何对象,因此很难告诉您错误是什么。

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 << ":)";
}

关于错误处理,return 和 exit 有什么区别吗?

唯一的主要区别是自动变量不会被销毁(因为 exit 不会返回,因此堆栈不会展开)。其他一切都一样。

当我使用 try catch 块时,我必须使用 int main(),而不是 void main() 吗?

使用void main() 无效。

程序的唯一有效版本的 main 声明如下:

int main()

int main(int argc, char* argv[])  // or equivalent types.

任何其他声明都是非标准的(尽管允许)。

注意事项:

6.8.3.1 主要功能
1:程序应包含一个名为 main 的全局函数。执行程序会启动一个执行主线程,在该主线程中调用主函数,并且可以初始化和销毁​​静态存储持续时间的变量。独立环境中的程序是否需要定义主函数是实现定义的。
2:实现不应预定义主要功能。该功能不得重载。它的类型应具有 C++ 语言链接,并且应具有声明的 int 类型的返回类型,否则其类型是实现定义的。一个实现应允许两者

— () 返回 int 和

的函数

——(int,pointer to pointer to char)返回int的函数

3: main 函数不能在程序中使用。 main 的链接是实现定义的。将 main 定义为已删除或将 main 声明为 inline、static 或 constexpr 的程序是格式错误的。不应使用链接规范声明主函数。在全局范围内声明变量 main 或使用 C 语言链接(在任何命名空间中)声明名称 main 的程序是格式错误的。名称 main 未被保留。

【讨论】:

  • “任何其他 main 声明都会导致程序定义不正确。” - 不这么认为 - 也许是实现定义的。当然,独立的实现或多或少可以做他们喜欢的事情。
  • @NeilButterworth 固定:我知道最好不要反驳你的知识。
  • 我发现类的析构函数有错误。很抱歉没有发布完整的源代码。
【解决方案2】:

处理这个错误与 main 的返回类型无关。它应该始终是int main()

returnexit()的区别:

  • return 为您的作用域变量调用析构函数
  • exit() 除静态变量外,不调用析构函数

所以你应该谨慎使用exit()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-25
    相关资源
    最近更新 更多