【问题标题】:What is the difference between returning new object immediately?立即返回新对象有什么区别?
【发布时间】:2020-08-10 18:22:34
【问题描述】:

这两者有什么区别:

try
{
    MyClass* tmp=new MyClass;
    return tmp
}
catch (...)
{
    cout << "Error";
}

try
{
    return new MyClass;
}
catch (...)
{
    cout << "Error";
}

我认为如果第二个发生错误,它会立即返回而不捕获错误,对吧?

【问题讨论】:

  • 假设约翰尼的猜测是正确的,拥有tmp 变量的好处是它更容易在调试器中看到。这有很多价值。对于那些担心开销的人来说,在优化的构建中,优化器非常非常擅长消除这种开销。
  • @NathanOliver 更新
  • 为什么你认为第二个例子不会捕获异常?
  • @dan 当然这两段代码是相同的。有时,显而易见的事情是真实的。
  • @dan 没有区别。编译器会将MyClass* tmp=new MyClass; return tmp 转换为return new MyClass;

标签: c++ class pointers


【解决方案1】:

他们做的事情完全相同。
并且(很可能)会生成完全相同的代码。

如果您使用的是交互式调试器,第一个会很有帮助。新建完成后,只需检查对象(通过单击 tmp(或在调试控制台中输入 print tmp))并查看是否已正确初始化就更容易了。

不是你经常做的事情,但它会出现。

【讨论】:

    【解决方案2】:

    这两段代码将完成同样的事情。第一个将更容易让您在调试器中查看 tmp 的值,或者添加一行以在调试时打印其值。

    与您的问题无关:您为什么使用新的?通常最好使用 std::unique_ptr 和 std::make_unique 而不是原始指针和 new。 std::unique_ptr 也将引用动态分配的 MyClass 实例,但会在超出范围时自动调用 delete,从而降低程序中内存泄漏的可能性。

    【讨论】:

      【解决方案3】:

      两者具有相同的功能。 如果在为 MyClass 分配内存时出现错误,try{ } 和 catch(...) 也可以正常工作。

      但我个人更喜欢新方法,因为有时我会在返回类之前做一些事情。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-24
        • 2020-02-01
        • 2023-03-31
        • 1970-01-01
        • 2019-10-08
        相关资源
        最近更新 更多