Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
模板数组句柄库中的内存泄漏 我使用C++ 98。当我尝试运行下面的代码并注意任务管理器时,内存消耗会非常高。有人能解释一下main中的注释部分是否有泄漏,如果有,如何修复 #include <iostream> #include<vect_C++_Memory Leaks - Fatal编程技术网

模板数组句柄库中的内存泄漏 我使用C++ 98。当我尝试运行下面的代码并注意任务管理器时,内存消耗会非常高。有人能解释一下main中的注释部分是否有泄漏,如果有,如何修复 #include <iostream> #include<vect

模板数组句柄库中的内存泄漏 我使用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() {

模板数组句柄库中的内存泄漏 我使用C++ 98。当我尝试运行下面的代码并注意任务管理器时,内存消耗会非常高。有人能解释一下
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++(不管它是否有漏洞)