删除指向不同指针类型的复制指针是否会导致内存泄漏
Does deleting copied pointers to differing pointer types cause a memory leak?
我已经在我的应用程序中缩小了我的AVI视频播放器正在泄漏内存的范围。我有以下代码:
...
LPBYTE pChunk = new BYTE[lSize];
if(!pChunk)
return false;
hr = AVIStreamReadFormat(pStream, AVIStreamStart(pStream), pChunk, &lSize);
if(hr)
{
delete [] pChunk;
return false;
}
m_pVideoFormats[i] = (LPBITMAPINFO)pChunk;
稍后需要删除视频时,我只需删除:
if(m_pVideoFormats[i])
delete [] ((LPBYTE)m_pVideoFormats[i]);
这会导致内存泄漏吗,因为我如何投射这个指针?谢谢!
不,这不会泄漏。不管你如何投射它,重要的是你删除你分配的相同类型。您已将BYTE[]
与BYTE[]
匹配,所以这不是您的问题。
你的代码不会泄漏内存,但你正在做一些不必要的事情。
- 在
new
后检查nullptr
毫无意义,因为如果分配失败,则会抛出std::bad_alloc
而不是返回nullptr
。 - 同样,在
delete
之前检查nullptr
也是不必要的,因为delete [] nullptr
是完全有效的。
此外,使用智能指针,而不是管理指向原始内存块的指针。
std::unique_ptr<BYTE[]> pChunk;
try {
pChunk.reset( new BYTE[lSize] );
} catch( const std::bad_alloc& ) {
return false;
}
hr = AVIStreamReadFormat(pStream, AVIStreamStart(pStream), pChunk, &lSize);
if(hr)
{
// delete [] pChunk; // not needed - smart pointer will free memory
return false;
}
m_pVideoFormats[i] = (LPBITMAPINFO)pChunk.release();
...
delete [] ((LPBYTE)m_pVideoFormats[i]);
m_pVideoFormats[i] = nullptr; // set to nullptr to avoid double deletion
相关文章:
- 新分配指向函数的指针是否合法?
- 在函数结束后使用指向变量的指针是否安全?
- C++ 返回指向函数内定义的静态数组的指针是否有效?
- 经过最后一个数组元素末尾的指针是否应该等于超过整个数组末尾的指针?
- 传递给放置 new 的指针是否是指向其对象表示形式的非 UB 指针?
- 'this'指针是否可以在 c++ 标头声明中使用?
- C++ 在向量中使用指针是否可能导致指针悬空?
- 唯一指针是否在堆或堆栈上分配内存?
- 将基本实例指针强制转换为派生实例指针是否合法?(实例不是派生实例)
- 当向量增长时,指向向量元素的C++指针是否无效
- 如何判断指针是否是指向数组的指针
- 在类方法中使用 "this" 指针是否是一种好的做法?
- 如何知道指针是否已在其他地方释放
- 结构成员指针是否自动初始化为零?
- 为静态类创建指向对象的指针是否合法?
- 新的自动关键字指针是否会自行删除?
- 创建指针是否超过非数组指针的末尾,而不是从 C++17 中的一元运算符和未定义的行为派生?
- 检查指针是否指向矢量元素
- 如何创建一个带锁的指针数组并检查指针是否空闲?
- 在映射中插入更多元素后,指向 QMap 中元素的指针是否仍然有效?