【问题标题】:Why don't visual studio code throw error when handle with null value?为什么在处理空值时 Visual Studio 代码不会抛出错误?
【发布时间】:2021-11-14 15:45:54
【问题描述】:

我有以下代码:

class A
{
public:
    int *b;
};
int main()
{
    A *a = new A();
    a->b = new int(1);
    cout << *a->b;
    cout << "done";
    return 0;
}

我运行它并得到预期的输出 1done 但是当我评论 a-&gt;b = new int(1); 它什么也不打印。如何让它为我抛出一些东西来确定我的代码中的错误所在。我的 VS Code 版本是 1.60.1。

提前致谢。

【问题讨论】:

  • 变量最重要的事情之一是初始化。您没有初始化b。您可能应该编写一个至少将 b 初始化为 nullptr 的构造函数。我相信int *b = nullptr 在这种情况下就足够了。
  • “如何让它抛出一些东西让我确定我的代码中的错误所在。”不要使用 C++。您可能会发现调试构建会抛出 大多数 未定义的行为,但不是全部。

标签: c++ visual-studio-code gcc


【解决方案1】:

这不是 Visual Studio Code 的错。如果您注释掉 a-&gt;b = new int(3) 行,您的代码将具有 未定义的行为(它可能会引发分段错误,也可能不会)。请参阅I get a segmentation fault instead of an exception,了解在发生分段错误时如何不能抛出异常(VS Code 可以显示)。

你可以去 VS Code 的终端,然后运行:

g++ yourfile.cpp
./a.out

这向我展示了这样的分段错误:

./a.out
Segmentation fault (core dumped)

【讨论】:

  • Your code will throw segmentation fault 不是真的。它是 UB,所以任何事情都可能发生
  • @phuclv 你是对的......未定义的行为。谢谢。
  • @phuclv 是的,它对我没有任何影响。但是,如果我的代码中有多个segmentation fault,我如何才能修复错误的位置?
  • @PhuocNguyen 程序员的工作是永远不要留下任何未初始化的东西,永远不要访问未初始化或越界的内存。如果一个程序的行为不稳定或任意,那么它可能有 UB。始终启用编译器警告并修复它们,尽管在这种情况下它可能对您没有帮助
  • @zedfoxus 谢谢我明白了
猜你喜欢
  • 2014-06-19
  • 1970-01-01
  • 1970-01-01
  • 2017-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多