删除运算符导致资源泄漏
Resource leak due to delete operator
这是我写的代码:
class sCircBuffer
{
public:
sCircBuffer(void);
~sCircBuffer(void);
double *Data;
int Size;
bool Init(int SizeBuffer);
bool Delete();
}
sCircBuffer :: sCircBuffer(void) //Constructor
{
Data=NULL; //Initialize input circular buffer
}
sCircBuffer :: ~sCircBuffer(void) //Destructor
{
delete [] Data; //Initialize input circular buffer
Data=NULL;
}
bool sCircBuffer :: Init(int SizeBuffer)
{
delete [] Data; //Initialize input circular buffer
Data=new double [SizeBuffer]; //Initialize input circular buffer
Size=SizeBuffer;
for (int i=0; i<Size; i++)
Data[i]=0;
return true;
}
bool sCircBuffer :: Delete()
{
delete [] Data; //Initialize input circular buffer
Data=NULL;
return true;
}
我正在另一个类中创建一个以上类的对象:
class PerChannel
{
public:
PerChannel();
~PerChannel();
sCircBuffer m_InputDataRaw;
}
PerChannel :: PerChannel()
{
m_InputDataRaw.Init(MAX_NUM_TO_FETCH); // MAX_NUM_TO_FETCH = 1000
}
PerChannel :: ~PerChannel()
{
m_InputDataRaw.Delete();
}
在Coverity和C++内存验证器中,我在PerChannel的构造函数中遇到了资源泄漏错误。
我不确定这里出了什么问题?
非常感谢你的帮助。
正泰
在sCircbuffer
的init
方法中,您尝试使用指向NULL的指针delete []
。
首先,不清楚m_InputDataTelem是什么,因为您已将m_InputDataRaw指定为类中的循环缓冲区,而不是m_InputDataTelm。
到目前为止,您正在调用init,而没有首先构造sCircBuffer,因此试图删除尚未初始化的缓冲区(访问冲突)。
如果我是你,我会明确地更改类接口,例如定义一个构造函数,如:
sCircBuffer(int size=SOME_USEFUL_VALUE);
并在其中分配我的初始缓冲区。让我说Delete()方法是一个可怕的想法:你应该简单地在Init()方法中处理删除(例如,我会称之为Resize())。正在让类的用户删除内部缓冲区。。。好吧,它只是违背了面向对象设计的本质。
无论如何,如果你不想在保持代码原样方面遇到麻烦,你至少可以在构造函数中添加以下行:
Size= 0;
Data= new double [Size];
但我仍然相信,将其初始化为一个有意义的大小将是一个更好的解决方案。
相关文章:
- 具有瞬态资源的RAII类
- valgrind-hellgrind与泄漏检查的结果不同
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 从构造函数抛出异常时如何克服内存泄漏
- Klocwork Inside的资源泄漏
- C Winsock接受内存泄漏/资源泄漏
- 资源泄漏与否(Mac OS X)
- 资源泄漏:fExclfile
- 内核资源泄漏BIO_do_connect
- 如何更正GDI资源泄漏
- 数组中的资源泄漏
- 删除运算符导致资源泄漏
- 多态性=资源泄漏中基类缺少虚拟析构函数
- 下面的代码会导致资源泄漏吗?
- 使用std::uninitialized_copy的Stroustrup示例中的资源泄漏
- 资源泄漏opengl/win32
- MFC SendMessage()中的资源泄漏
- 从RAII对象泄漏资源
- 了解c++中内存泄漏的良好资源/书籍
- 我的程序泄漏了boost::shared_ptr拥有的资源