C ++函数返回引用和内存

时间:2016-07-31 18:16:49

标签: c++ memory optimization

我的项目中有几个创建对象的函数。例如,如果你有一个函数来创建这样的对象:

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

然后当你打电话给你时

int x = f();

或类似

std::cout << f();

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

2 个答案:

答案 0 :(得分:7)

事实上,这是非常错误的。您忘记参考的那一刻就是您泄漏资源的那一刻。并且您正在使用int x = f();

与第二种情况相同,std::cout << f(); - 如果您没有动态分配delete int,请不要使用此功能。

int也会按值传递给std::basic_ostream::operator<<,并制作副本。这实际上并不重要,没有普通代码会接受引用,然后调用delete &ref;

以下是您的链接:RAII

我无法从你做出的例子中知道你想要什么,但是考虑按值返回,或者在多态的情况下使用智能指针。

答案 1 :(得分:0)

如果要显示该函数使用new委托创建对象的所有权,则必须使用std :: unique_ptr显式执行此操作。正如您所看到的,您的功能会自我记录,您无需查看正文以了解删除的响应:

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