【问题标题】:Return pointer to array or make void function with parameter返回指向数组的指针或带参数的 void 函数
【发布时间】:2014-11-22 14:30:25
【问题描述】:

到目前为止,我大部分时间都在使用返回指向数组的指针的函数,但现在我开始使用 void 函数来引用数组,所以我想知道下面哪一个代码更好用,为什么?

void doSomething(int** &ary)
{
    ary = new int*[3];
    for (int i = 0; i < 3; ++i)
        ary[i] = new int[3];
    ary[0][0] = 1;
    ary[0][1] = 2;
}

int** ary=NULL;
doSomething(ary);

或者这个

int** doSomething1()
{
    int **ary = new int*[3];
    for (int i = 0; i < 3; ++i)
        ary[i] = new int[3];
    ary[0][0] = 1;
    ary[0][1] = 2;
    return ary;
}

int **ary1=doSomething1();

【问题讨论】:

  • 见仁见智。第二个版本没有第一个那么糟糕。
  • 还有什么会更好?
  • 使用代表您要返回的任何内容的类型。指向指针的指针可能意味着太多东西。
  • 两者都不是更好,请返回std::vector,直到您有真正的理由不这样做。然后,切换到 C++ 11 移动语义。

标签: c++ pointers multidimensional-array


【解决方案1】:

这是一个意见问题,但是,这是我的:

我认为返回指针的版本更好。为什么?仅仅因为它使调用站点不那么神奇。使用返回变量,您可以像这样调用函数:

int** my2dArray = doSomething();

很清楚,my2dArray 被初始化为指向函数提供的某个数组。 不看函数定义。

另一方面,调用

int** my2dArray;
doSomething(my2dArray);

应该始终为读者敲响警钟:看起来好像您正在将未初始化的指针传递给函数。即使在查找函数定义后,看到指针是通过引用传递的,读者仍然不能确定该函数没有解释传入的值。它需要仔细查看代码以确保这个电话确实是合法的。

所以,为了可调试性,我避免传递引用参数。我按值传递,我通过const 引用(与按值传递具有相同的语义)传递,或者我通过显式指针传递。这样一来,任何函数调用都不能修改在调用站点上不明确可见的值。

【讨论】:

  • 内存泄漏或性能如何?也许还有其他更好的选择?
  • 为了防止内存泄漏,您应该使用智能指针(std::unique_ptr&lt;&gt;std::shared_ptr,或类似的)。在性能方面,您需要担心您的对象不会被不必要地复制,您可以通过传递 const 引用轻松实现这一点。通过引用传递和通过显式指针传递在性能方面是等效的。
  • 感谢您的精彩解释。
【解决方案2】:

这两个例子没有太大区别,但我更喜欢第二个例子。

在第一个示例中,您引用了ary,这意味着您的程序每次访问ary 中某处的元素时都必须取消引用所有指针。 (代码编译后的引用相当于指针)

在第二个例子中,只需要在函数返回时复制指针即可。

第一个例子:

对数组指针的引用 -> 指向数组的指针 -> 数组中的元素

第二个例子:

指向数组的指针 -> 数组中的元素

【讨论】:

    猜你喜欢
    • 2020-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-12
    • 1970-01-01
    • 2021-06-25
    • 1970-01-01
    • 2018-04-06
    相关资源
    最近更新 更多