2011-01-24 40 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(); 
} 
相關問題