模板数组句柄库中的内存泄漏 我使用C++ 98。当我尝试运行下面的代码并注意任务管理器时,内存消耗会非常高。有人能解释一下main中的注释部分是否有泄漏,如果有,如何修复 #include <iostream> #include<vect
模板数组句柄库中的内存泄漏 我使用C++ 98。当我尝试运行下面的代码并注意任务管理器时,内存消耗会非常高。有人能解释一下模板数组句柄库中的内存泄漏 我使用C++ 98。当我尝试运行下面的代码并注意任务管理器时,内存消耗会非常高。有人能解释一下main中的注释部分是否有泄漏,如果有,如何修复 #include <iostream> #include<vect,c++,memory-leaks,C++,Memory Leaks,模板数组句柄库中的内存泄漏 我使用C++ 98。当我尝试运行下面的代码并注意任务管理器时,内存消耗会非常高。有人能解释一下main中的注释部分是否有泄漏,如果有,如何修复 #include <iostream> #include<vector> using namespace std; template<typename T> class ArrayHandler { public: ArrayHandler() {
main
中的注释部分是否有泄漏,如果有,如何修复
#include <iostream>
#include<vector>
using namespace std;
template<typename T> class ArrayHandler
{
public:
ArrayHandler()
{
val=NULL;
count=0;
}
~ArrayHandler()
{
freecontent();
}
void assign(T* p, int32_t icount)
{
freecontent();
count=icount;
val= new T[count];
for(int32_t i=0;i<icount;i++)
{
val[i]=p[i];
}
}
void resize(int32_t newsize)
{
if(newsize==count)
return ;
else
{
T* p= new T[newsize];
int32_t maxcount= count-1;
for(int32_t i=0; i< maxcount;i++)
{
if(maxcount>i)
p[i]= val[i];
else
p[i]= val[maxcount];
}
assign(p, newsize);
}
}
private:
T* val;
int32_t count;
void freecontent()
{
delete[] val;
val=NULL;
}
};
template<typename T> void handlesettingsize(T* p, ArrayHandler<T>& val, int32_t icount)
{
val.assign(p,icount);
if(icount==4)
{
//do nothing
}
else
{
val.resize(100);
}
}
int main()
{
ArrayHandler<double> val;
for(int32_t i=0;i<15000;i++)
{
double *p =new double[6];
for(int32_t i=0;i<6;i++)
p[i]=0.0+i;
handlesettingsize(p, val, 5); // Task manager shows increased memory consumption if not commented
delete[] p;
p=NULL;
}
return 0;
}
#包括
#包括
使用名称空间std;
模板类ArrayHandler
{
公众:
ArrayHandler()
{
val=NULL;
计数=0;
}
~ArrayHandler()
{
免费内容();
}
无效分配(T*p,int32\u T i计数)
{
免费内容();
计数=i计数;
val=新的T[计数];
对于(int32_t i=0;ii)
p[i]=val[i];
其他的
p[i]=val[maxcount];
}
赋值(p,newsize);
}
}
私人:
T*val;
int32_t计数;
void freecontent()
{
删除[]val;
val=NULL;
}
};
模板无效handlesettingsize(T*p、ArrayHandler和val、int32_T icount)
{
赋值(p,i计数);
如果(icount==4)
{
//无所事事
}
其他的
{
val.resize(100);
}
}
int main()
{
阿拉伊汉德勒;
对于(int32_t i=0;i使用valgrind而不是taskmanager。由于内存没有立即返回到操作系统,因此检测泄漏非常不可靠。我没有发现泄漏,但发现了另一个问题。您delete[]p;
但是p
没有通过new[]
分配,这肯定是错误的delete[]p;
有未定义的行为。我很惊讶程序没有崩溃。p
没有指向由new[]
创建的内存,因此您不能delete[]
it。代码应该实现什么?我确信在C++98中,也没有理由对new
和delete
执行这种杂技。如果您想要一个可调整大小的数组,那就是std::vector
,从一开始就可以使用beginning@G.DineshNathan是的,它可能包含泄漏。有关原因,请参阅。解决您的问题的最佳答案真正的问题是:使用valgrind。也许你很幸运,有人能发现你代码中的漏洞,但唯一可行的方法是使用分析工具。除此之外,ArrayHandler
肯定被打破了,因为违反了规则3,它只是不会发生在你的代码中,但UB就潜伏在下一个角落里。还有,delete[]P,绝对是UB,如果有泄漏问题,有第二个,你的代码不是有效的C++(不管它是否有漏洞)