在这种情况下内存泄漏?反复使用新关键字
Memory leak in this situation? Using new keyword over and over
我对内存泄漏非常谨慎,所以我想我应该对此进行验证。在以下示例中,是否存在内存泄漏?我的直觉是肯定的。
class Handler // Class definition
{public:
~Handler();
int* ptrToInts;
};
Handler::~Handler() // Class destructor
{
delete[] ptrToInts;
}
Handler handler; // Global object
void aFunction()
{
handler.ptrToInts = new int[20];
}
int main()
{
bool quit = false;
while(!quit)
{
aFunction();
}
return 0;
}
ptrToInts每次都会在堆上的单独内存中创建20个单独的新int吗?
另外,另一个问题是,如果没有析构函数,动态分配的内存会被释放吗?就好像类的生存期就是程序的持续时间一样,它会清理所有"新"内存吗?
编辑:谢谢你的回答。我之所以问这个问题,是因为每次为Raw Input调用WndProc时,我都会尝试绕过调用new和delete,基本上,MSDN告诉你这样做。看起来效率很低。
在不使用delete[]
取消分配堆上已分配内存的情况下重新分配指针后,就会产生内存泄漏。如果每次调用aFunction()
时它都会重新分配指针,则会发生这种情况。
至于第二个问题,析构函数将只delete[]
分配给指针的最后一个数组。
只有delete[]
释放由new
分配的内存。每次使用new
时,都需要delete
。
对于另一个问题,基于文档:
MyClass * p1 = new MyClass[5]; // allocates and constructs five objects
是的,当您多次调用该函数时,如果每次调用后都没有显式释放handler.ptrToInts
,则会出现内存泄漏;
void aFunction()
{
handler.ptrToInts = new int[20];
}
//-----somewhere we see the caller
while(!quit)
{
aFunction();
}
然而,这是一个检测泄漏的琐碎案例。。。您应该学会使用泄漏检测器和静态分析仪。
请参阅如何检测/避免(非托管)代码中的内存泄漏?
当然存在内存泄漏。您在中分配int
void aFunction()
{
handler.ptrToInts = new int[20];
}
而不首先释放旧的int,如
void aFunction()
{
delete [] handler.ptrToInts;
handler.ptrToInts = new int[20];
}
调用aFunction()
将导致"无限"内存分配。而您的析构函数,只释放最后分配的int,甚至从未被调用。
为什么您的处理程序不管理它自己的内存?
在对象外部分配内存并在对象内部释放内存是非常糟糕的做法,反之亦然。
为什么不以这种方式实现Handler类:
class Handler
{
public:
Handler();
~Handler();
void aMethod();
private:
int* ptrToInts;
};
Handler::Handler() {
handler.ptrToInts = new int[20];
}
Handler::~Handler() {
delete[] ptrToInts;
}
void Handler::aMethod() {
delete[] ptrToInts;
handler.ptrToInts = new int[20];
}
int main() {
bool quit = false;
Handler handler;
while(!quit) {
handler.aMethod();
}
}
- 我是c ++的新手,你能解释一下在这种情况下的指针吗
- 在这种情况下,java对象是否可以调用本机函数
- 在这种情况下显式调用时,std::cout 如何更改析构函数的行为?
- 在这种情况下,我真的复制了字节还是复制了字符?
- 为什么在这种情况下,bool 类型的输出等于 0?
- 在这种情况下,如何传递成员函数而不是函数?
- 为什么在这种情况下递增阵列名称有效?
- 在这种情况下我应该使用哪种设计模式
- 为什么在这种情况下我需要 .template
- 在这种情况下,使用 string_view 是否会导致不必要的字符串复制?
- 我是否访问了已释放的内存,或者在这种情况下DrMemory报告不正确?
- 在这种情况下,"typename..."意味着什么?
- 为什么在这种情况下 x = 44?
- 在这种情况下是私有的吗?试图使操作员<<过载
- 在这种情况下,如何防止C++输出/控制台窗体关闭
- 为什么 lambda nullptr 取消引用在这种情况下有效?
- 为什么在这种情况下,前向声明不起作用?
- 为什么在这种情况下不调用我的虚拟函数实现?
- 如何在不使用 "new" 关键字的情况下解除分配创建的对象的内存?
- 在这种情况下内存泄漏?反复使用新关键字