【问题标题】:Program doesn't stop after returning 0 from main从 main 返回 0 后程序不会停止
【发布时间】:2018-09-02 14:51:57
【问题描述】:

我编写了一个使用霍夫曼编码对文件进行编码的程序。
它工作正常,但由于某种原因,从主函数返回 0 后它并没有停止。
主要功能如下:

int main(int argc, char *argv[])
{
    if (argc < 5)
    {
        std::cout << "..." << std::endl;
    }
    else
    {
        if (!std::strcmp(argv[1], "haff") && !std::strcmp(argv[2], "-c"))
            HuffmanC(argv[3], argv[4]);
        if (!std::strcmp(argv[1], "haff") && !std::strcmp(argv[2], "-d"))
            HuffmanD(argv[3], argv[4]);

        std::cout << "Operations: " << count << std::endl;
    }

    return 0;
}

当我运行它时,我得到:

MacBook-Pro-Alex:code alex$ ./main haff -c test.txt test.haff
操作:37371553

它以空行结束,终端表示程序继续运行,但最后一个 cout 语句执行良好,我得到它应该返回 0 并完成。返回0后如何使其完成?还是其他代码有问题?

【问题讨论】:

  • 如果你有一个空的 main:int main() {},程序是否也继续运行?
  • HuffmanCHuffmanD 是否生成线程?
  • 他们必须产生,然后孤立其他进程才能具有您所描述的行为
  • 通过在返回零之前添加断点来运行堆栈跟踪,并查看剩余的进程。您这里有一个严重的内存问题。
  • @NathanOliver 即使他们这样做了,一旦 main 返回,所有线程也会终止。所以这不会导致声称的行为。

标签: c++ c++11


【解决方案1】:

或者是其余代码的问题?

可能。也许你已经以某种方式破坏了你的堆栈,所以你从 main “返回”到你没想到的地方。没有complete, verifiable example,我们真的无法知道。

返回0后如何让它完成?

您可以在 MacOS 上使用kill 命令强制终止它。使用 GUI 任务管理器可能有效,也可能无效。

但也许更有效的做法是将调试器附加到进程并查看它实际在做什么。

您可以阅读this explanation,了解如何使用 XCode 在 MacOS 上执行此操作 - 但我不使用 MacOS,所以我不知道。此外,@SergeyA 亲切地建议尝试using pstack 来获取进程的当前堆栈。当然,如果堆栈出现乱码,则无法确定您实际会得到什么。

确保编译应用程序时包含调试信息。

最后 - 最好先运行带有调试器的程序,然后在最后的cout &lt;&lt; 行设置断点。

【讨论】:

猜你喜欢
  • 2013-01-26
  • 1970-01-01
  • 2017-06-16
  • 2014-02-25
  • 1970-01-01
  • 2022-01-25
  • 2012-04-25
  • 2015-07-03
  • 1970-01-01
相关资源
最近更新 更多