返回新分配的指针或通过参数更新对象?

时间:2014-05-08 17:50:51

标签: c++ pointers return-value dynamic-memory-allocation

我实际上正在处理指向用户定义对象的指针,但为了简单起见,我将使用整数来演示这种情况。

int* f(){
    return new int(5);
}

void f2(int* i){
    *i = 10;
}

int main(){

    int* a;
    int* b = new int();

    a = f();
    f2(b);

    std::cout << *a << std::endl;    // 5
    std::cout << *b << std::endl;    // 10

    delete b;
    delete a;
    return 0;
}

考虑在函数f()f2()中有一些更复杂的计算,它们确定要返回的指针的值(f())或通过参数更新({{1} })。

由于它们都有效,我想知道是否有理由选择其中一种?

3 个答案:

答案 0 :(得分:1)

通过查看玩具代码,我的第一个想法是将f / f2代码放入实际对象的构造函数中,并完全取消自由函数。但假设这不是一个选项,它主要是的风格/偏好问题。以下是一些注意事项:

第一个更容易阅读(在我看来)因为很明显指针是一个输出值。当您将(非对象)指针作为参数传递时,很难一目了然地判断它是输入,输出还是两者。

首选的另一个原因是,如果您订阅了思想学校,那么就应该尽可能使对象变为不可变,以便简化代码的推理并排除线程安全问题。如果你正在尝试,那么唯一真正的选择是f()创建对象,配置它,并返回const Foo*(再次,假设你不能只是将代码移动到构造函数)。 / p>

首选的一个原因是它允许您配置在别处创建的对象,并且对象可以是动态的也可以是自动的。虽然这可能实际上是反对这一方法取决于上下文 - 有时最好知道某个类型的对象将始终在一个位置创建和初始化。

答案 1 :(得分:0)

如果分配函数f()与new相同,那么只需调用new。你可以在对象的构造中做任何初始化。

作为一般规则,尽可能避免传递原始指针。但是,如果对象必须比创建它的函数更长,那么这可能是不可能的。

对于一个简单的案例,就像你所展示的那样,你可能会做这样的事情。

void DoStuff(MyObj &obj)
{
    // whatever
}

int Func()
{
    MyObj o(someVal);
    DoStuff(o);
    // etc
}

答案 2 :(得分:0)

f2更好只是因为int的所有权非常明确,并且因为您可以根据需要分配它。这个理由足以挑选它。