2011-01-24 79 views
1
template < typename ArrayType > 
ArrayType *VectorToArray(ArrayType **p_ppThisBlock = NULL, vector<ArrayType> *p_vThisVector = NULL) 
{ 
    // Check to see if both parameters are valid. 
    if(p_ppThisBlock == NULL || p_vThisVector == NULL) 
    { 
     return NULL; 
    } 

    else if(p_ppThisBlock != NULL && p_vThisVector != NULL) 
    { 
     // Create the array that will store the vector's elements dynamically. 
     p_ppThisBlock = new ArrayType[ p_vThisVector -> size() ]; 

     // Initialize the array. 
     for(unsigned uIndex(0); uIndex < p_vThisVector -> size(); uIndex++) 
     { 
      p_ppThisBlock[ uIndex ] = p_vThisVector[ uIndex ]; 
     } 

     // Return the pointer that pointing to the new block of memory. Is this relevant? 
     return p_ppThisBlock; 
    } 
} 

我的问题是:是否返回我在此函数中创建的相关内存块?(第12行)。我应该返回这个内存块吗?

+8

噢,我的。你为什么做这个?你不能只用`&v [0]`?至少,确保使用智能指针(使用数组删除器);否则这段代码肯定不是异常安全的。 – 2011-01-24 23:30:07

+1

除此之外,你写的甚至不能正常工作:赋值`p_ppThisBlock = new ArrayType [...]`是ArrayType *和ArrayType **之间的不匹配(应该得到编译器警告在这里);你想要`* p_ppThisBlock = ...`。同样在for循环中,你需要`(* p_ppThisBlock)[uInde​​x] =(* p_vThisVector)[uInde​​x]`。 – 2011-01-24 23:58:04

回答

2

最终;不这样做会导致内存泄漏。

如果该函数分配数组并将其留给调用者释放内存,这没什么问题。如果调用者认为内存稍后释放(而不是我们在这里看到的),则会导致内存泄漏。

为什么不能退回vector< vector<ArrayType> >

编辑:

尝试给该方法以下签名。

template <typename ArrayType> 
vector<vector< ArrayType> >& VectorToArray( 
           vector< vector<ArrayType> >& _block, 
           vector<ArrayType>& _vec) 
{ 
    //No need to check parameters 

    //Initialize the array 
    for (unsigned uIndex(0); uIndex < _vec.Size(); uIndex++) 
    { 
     _block.push_back(_vec); 
    } 

    return _block; 
} 

相同的结果,更少的错误检查,无泄漏。当然,这需要引用而不是原始指针。

1

发布代码存在严重问题。绝对最明显的问题是你检查两个指针​​是否传递给函数,如果它们是你指向其他的一个。除非调用你的函数的人释放p_ppThisBlock用来指向的内存,否则你有明确的内存泄漏。

此外,从哲学的角度来看,你试图做太多的功能(你的函数比较realloc - 这可能free内存,或者什么也不做,或者分配更多的内存和改变的值指针取决于传入的参数)。

但是,要回答您所问的问题:是的,返回指向您通过new分配的内存的指针是有效的。这就是分配的内存如何超过其范围。这是new的原因之一。

int* allocateBlockOfIntsUsingAFunction(int numberOfInts) 
{ 
    return new int[numberOfInts]; 
} 

作为另一个答复中提到,分配内存,然后没有告诉任何人是一个肯定的道路内存泄漏:

void leakMemory() 
{ 
    new int[1024]; 
    return; 
} 
int main() 
{ 
    while (true) 
     leakMemory(); 
} 
相关问题