在不知道类型的情况下将Array清除为NULL

时间:2010-06-26 18:13:12

标签: c++

我必须创建一个函数,它可以接收一个已知大小的指针数组,并将所有指针设置为NULL。需要注意的是,我事先并不知道这种类型。这是我到目前为止所尝试的:

    template <typename T>
  static void Nullify(T** _Array, int _Size, unsigned int _SizeOf)
  {
   for (int i = 0; i < _Size; i++)
   {
    _Array[i * _SizeOf] = NULL;
   }
  }

哪个给了我错误(不是函数本身,但是我正在践踏内存我不应该踩踏导致以后导致内存错误)。我传入数组(_Array - 已初始化为_Size),其大小(_Size)和sizeof(指针*)作为_SizeOf。

任何帮助都将非常感谢:)

5 个答案:

答案 0 :(得分:7)

您不需要_SizeOf。这就是你想要的:

template <typename T>
static void Nullify(T** _Array, int _Size)
{
   for (int i = 0; i < _Size; i++)
   {
      _Array[i] = NULL;
   }
}

编译器知道指针的大小,并在数组解除引用期间为你做数学运算。

答案 1 :(得分:3)

template <class T>
void Nullify(T** the_array, unsigned int size)
{
    std::fill(the_array, the_array + size, static_cast<T*>(0) );
}

template <class T, unsigned int N>
void Nullify(T* (&the_array)[N])
{
    Nullify(the_array, N);
}

第二个允许你传递一个指针数组并使其无效,甚至不传入一个size参数。这要求您传入一个实际数组,而不是指针:

Foo* x[10] = {...}
Nullify(x); // sets all pointers in x to 0 (NULL)

...或者如果你只是想在循环中自己写出来(这通常不会像std :: fill一样快,甚至可以通过非常有效的POD汇编代码来实际填充):

template <class T>
void Nullify(T** the_array, unsigned int size)
{
    for (unsigned int j=0; j < size; ++j)
        the_array[j] = 0;
}

请注意,我也避免使用NULL,原因与Stroustrup相同(避免需要包含cstddef)。当C ++ 0x被更广泛地实现时,nullptr关键字将成为一个很好的替代品。

BTW:函数模板忽略static关键字。它们已经具有内部联系,因此添加它是多余的。

答案 2 :(得分:1)

您不应该_Array[i * _SizeOf] = NULL,而是_Array[i] = NULL

答案 3 :(得分:1)

我同意里德的回答,当然你也应该删除作业中的'* _SizeOf'。

如果可能,我还建议您远离“原始”数组并在代码中使用std :: vector。它是一种更安全的结构,具有类似数组的语义,并且只需要一点开销。

答案 4 :(得分:0)

你不应该依赖_SizeOf你的值来评估它的类型,你应该使用一个函数来确定它的类型。

您在什么时候声明T** _Array?也许在这里你应该确保你的方法保证你的程序的任何部分调用它的特定类型的Array,对吗?