c ++数组传递困境

时间:2010-04-21 10:01:42

标签: c++ arrays function

我正在编写一个带字符串,字符串指针和int的函数。 该函数根据一组规则拆分字符串,并将每个标记放入一个数组中。我需要使用int变量中的元素数量将函数返回到函数中。我不知道如何返回数组,因为我无法使用auto,因此它被销毁,我不愿意使用new作为我觉得这很不完整。

关于如何解决这个问题我还有其他想法,但我想先了解其他人如何解决这个问题。我也可能是错的,有可能将一个自动传递出一个数组。我也不能使用向量,所以有一个复制构造函数。

无法使用矢量,因为这是一个挑战,我被要求不使用模板。

5 个答案:

答案 0 :(得分:2)

考虑到这些限制,这更多是C而不是C ++问题。

返回数组的常见C模式实际上是让调用者传入一个数组来填充。这使得调用者可以决定分配(从而解除分配)。

你的函数原型看起来像

int Function(string str1, string_ptr str2, int n, int* pOutArray, int cOutArray);

函数返回写入pOutArray的元素数。

在pOutArray处理为NULL的实现中,在这种情况下,你只计算元素的数量,然后返回。这使您可以根据需要以多种方式之一调用该函数: -

int out[5]={0};
int cFilled = Function(s1,s2,x,out,_countof(out));
// Further code can use up to 5<cFilled elements from the array.

,或者

int cElt = Function(s1,s2,x,NULL,0);
int* pOut = malloc(sizeof(int)*cElt);
Function(s1,s2,x,pOut,cElt);
// pOut now contains exactly the number of elements extracted.
free(pOut);

答案 1 :(得分:1)

自然选择 当然是将结果作为std::vector<std::string>传递。如果您不想使用此方法,则有两种选择:

  1. 让代码的客户端提供结果的存储,在这种情况下,客户端也可以传递提供的存储空间的大小。
  2. 使用new为结果分配空间,我认为这是一个更好,更强大的选择。您当然必须确保客户端稍后使用正确版本的delete删除内存,或者提供一种特殊的机制来释放内存。

答案 2 :(得分:0)

如果要返回固定大小的数组,可以使用boost::array。但是,如果您不想添加Boost依赖项,那么简单的解决方案是使用固定大小的数组创建数据结构,如:

template<typename T, std::size_t SIZE>
struct array_wrapper
{
     T array[SIZE];
};

如果大小可以改变,那么使用std::vector确实最有意义。请记住,返回包装类(如上所述)仍将导致创建副本(尽管是由编译器创建的)。因此,通过按值传递大结果而不是在堆上构造并传递指向分配数据的指针,您实际上不会节省任何费用,因此您的要求没有意义。

答案 3 :(得分:0)

传入'char&amp; **'和'int&amp; *'参数并在那里分配令牌,让责任释放内存给调用者。 现代标准不太好,但有效。

答案 4 :(得分:0)

如果您选择不使用管理内存的标准方法(即std :: vector),那么您将不得不做出选择。

三个基本选项是:

  1. 来电管理内存。调用者传入一块内存(可能还有一个指定该数组大小的int)。你填充那个数组。函数不需要进行内存分配。
  2. Callee管理内存。该函数分配一个足够大的块,填充它,然后返回一个指向它的指针。
  3. <强>协作即可。调用者传递一个回调函数,被调用者使用该函数来分配块。
  4. 选项(2)因某人需要释放内存而变得复杂。作为API的一部分,您需要指定函数是否以某种方式清除了以后(以及何时)阻塞,或者调用者是否负责。

    选项(3)可能有点过分 - 你需要编写一个函数来调用main函数。

    因此,选项(1)是您最好的(如果您不能使用向量)。这是一个非常标准的模式 - 例如,低级Windows API使用该模式。

    基本上,必须将内存管理记录为API的一部分。