我应该返回这个内存块吗?
问题描述:
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行)。我应该返回这个内存块吗?
答
最终;不这样做会导致内存泄漏。
如果该函数分配数组并将其留给调用者释放内存,这没什么问题。如果调用者认为内存稍后释放(而不是我们在这里看到的),则会导致内存泄漏。
为什么不能退回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;
}
相同的结果,更少的错误检查,无泄漏。当然,这需要引用而不是原始指针。
答
发布代码存在严重问题。绝对最明显的问题是你检查两个指针是否传递给函数,如果它们是你指向其他的一个。除非调用你的函数的人释放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();
}
噢,我的。你为什么做这个?你不能只用`&v [0]`?至少,确保使用智能指针(使用数组删除器);否则这段代码肯定不是异常安全的。 – 2011-01-24 23:30:07
除此之外,你写的甚至不能正常工作:赋值`p_ppThisBlock = new ArrayType [...]`是ArrayType *和ArrayType **之间的不匹配(应该得到编译器警告在这里);你想要`* p_ppThisBlock = ...`。同样在for循环中,你需要`(* p_ppThisBlock)[uIndex] =(* p_vThisVector)[uIndex]`。 – 2011-01-24 23:58:04