【问题标题】:C++ functions returning a reference and memory返回引用和内存的 C++ 函数
【发布时间】:2016-12-05 20:05:58
【问题描述】:

我的项目中有几个创建对象的函数。例如,如果您有一个函数可以生成这样的对象:

int& f()
{
    int *i = new int(5);
    return *i;
}

然后当你打电话给你的时候

int x = f();

或类似的东西

std::cout << f();

函数中创建的 int 会发生什么?引用是像普通变量一样处理还是我做错了什么?如果是这样,制作对象的正确方法是什么?

【问题讨论】:

    标签: c++ memory optimization


    【解决方案1】:

    这确实是大错特错。您忘记参考的那一刻就是您泄漏资源的那一刻。而你正在使用int x = f(); 来做这件事。

    与第二种情况相同,std::cout &lt;&lt; f(); - 如果您不打算使用动态分配 intdelete,请不要使用它。

    int 也按值传递给std::basic_ostream::operator&lt;&lt;,复制一份。这实际上并不重要,没有正常代码会接受引用然后调用delete &amp;ref;

    这里有一个链接:RAII


    我无法从您设计的示例中知道您想要什么,但请考虑按值返回,或者在多态的情况下使用智能指针。

    【讨论】:

    • 因此,如果我想要一个初始化对象的函数,然后返回对该对象的引用,这样您就不必初始化两个对象,我该怎么做?
    • 您的意思是避免复制吗? RVO 应该可以处理。
    • @user2271513 不应该使用构造函数来初始化对象吗?
    • 在这种情况下,构造函数在函数中被调用,然后你对对象做一些其他的事情,然后返回它。所以我有一个带有成员函数的类,它根据类的成员返回该类的对象
    • @user2271513 按值返回这样的对象是完全有效的常见做法。 RVO 将发挥作用。不要过早优化。
    【解决方案2】:

    如果你想显示函数用 new 委托创建对象的所有权,你必须明确地这样做,例如使用 std::unique_ptr。如您所见,您的函数已自我记录,您无需查看正文即可了解删除的响应:

    std::unique_ptr<int> foo() {
       return std::make_unique<int>(5);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-21
      • 2016-08-17
      • 2011-03-16
      • 2011-07-20
      • 2022-11-24
      • 2013-10-20
      相关资源
      最近更新 更多