none
vaild heap pointer RRS feed

  • 问题

  • 我遇到了这样的错误,vaild heap pointer。它是在运行时出现的,我现在没有什么C++开发经验,不知道怎么改。请问有什么方法找到并修改vaild heap pointer.


    class biginteger
    {
    public:
    	biginteger()
    	{
    		size=0;
    	}
    
    	biginteger(const string& strint)
    	{
    		if('-'==strint[0] || '+'==strint[0])
    		{
    			if('0'==strint[1])
    			{
    				cout<<"你给定的字符有误?第一位数字不能为0!!!"<<endl;
    			}
    			else
    			{
    				size=strint.size();
    				bigint=new unsigned int[size];
    				for(int i=1;i<size;++i)
    				{
    					if('-'==strint[0])
    					{
    						bigint[0]=11;
    					}
    
    					if('+'==strint[0])
    					{
    						bigint[0]=10;
    					}
    
    					bigint[i]=strint[i]-'0';
    				}
    			}
    		}
    
    		if('0'==strint[0])	
    		{
    			cout<<"你给定的字符有误?第一位数字不能为0!!!"<<endl;
    		}
    
    		if(strint[0]<='9' && strint[0]>='1')
    		{
    			size=strint.size()+1;
    			bigint=new unsigned int[size];
    			bigint[0]=10;
    			for(int i=1;i<size;++i)
    			{
    				bigint[i]=strint[i-1]-'0';
    			}
    		}
    	}
    
    	biginteger(const unsigned int * ai,const unsigned int bs)
    	{
    		size=bs;
    		bigint=new unsigned int[size];
    		for(int i=0;i<size;++i)
    		{
    			bigint[i]=ai[i];
    		}
    	}
    
    	biginteger(const biginteger& bi)
    	{
    		size=bi.size;
    		bigint=new unsigned int[size];
    		for(int i=0;i<size;++i)
    		{
    			bigint[i]=bi.bigint[i];
    		}
    	}
    
    	~biginteger()
    	{
    		delete[] bigint;		
    	}
    	
    	biginteger biabs()
    	{
    		if(11==bigint[0])
    		{
    			bigint[0]=10;
    			return *this;
    		}
    		return *this;
    	}
    	
    	biginteger& operator=(const biginteger& b)
    	{
    		delete[] bigint;
    		size=b.size;
    		bigint=new unsigned int[b.size];
    		for(int i=0;i<b.size;++i)
    		{
    			bigint[i]=b.bigint[i];
    		}
    		return *this;
    	}
    	
    public:
    	unsigned int* bigint;
    	unsigned int size;
    };
    这个是我的biginteger类

    2011年8月26日 3:16

答案

  • 我现在的默认构造,导致了创建一个对象时不一定用得着动态内存;可是我的析构仍然是按照使用了动态内存的方式进行的析构,极可能对一个不存在的内存析构,导致出现了vaild heap pointer.下面是我完善后的类 class biginteger { public: biginteger(const string& strint="-0") { if('-'==strint[0] || '+'==strint[0]) { if('0'==strint[1]) { if(2==strint.size()) { size=2; bigint=new unsigned int[2]; bigint[0]=10; bigint[1]=strint[1]-'0'; } if(strint.size()>2) { cout<<"第一位数字不能为0!!!,将初始化为0"<<endl; size=2; bigint=new unsigned int[2]; bigint[0]=10; bigint[1]=0; } } else { size=strint.size(); bigint=new unsigned int[size]; for(int i=1;i<size;++i) { if('-'==strint[0]) { bigint[0]=11; } if('+'==strint[0]) { bigint[0]=10; } bigint[i]=strint[i]-'0'; } } } if('0'==strint[0]) { if(1==strint.size()) { cout<<"第一位数字不能为0!!!,将初始化为0"<<endl; size=2; bigint=new unsigned int[2]; bigint[0]=10; bigint[1]=0; } if(strint.size()>1) { size=2; bigint=new unsigned int[2]; bigint[0]=10; bigint[1]=0; } } if(strint[0]<='9' && strint[0]>='1') { size=strint.size()+1; bigint=new unsigned int[size]; bigint[0]=10; for(int i=1;i<size;++i) { bigint[i]=strint[i-1]-'0'; } } } biginteger(const unsigned int * ai,const unsigned int bs) { size=bs; bigint=new unsigned int[size]; for(int i=0;i<size;++i) { bigint[i]=ai[i]; } } biginteger(const biginteger& bi) { size=bi.size; bigint=new unsigned int[size]; for(int i=0;i<size;++i) { bigint[i]=bi.bigint[i]; } } ~biginteger() { delete[] bigint; } biginteger biabs() { if(11==bigint[0]) { bigint[0]=10; return *this; } return *this; } biginteger& operator=(const biginteger& b) { if(this==&b) { return *this; } delete[] bigint; size=b.size; bigint=new unsigned int[b.size]; for(int i=0;i<b.size;++i) { bigint[i]=b.bigint[i]; } return *this; } public: unsigned int* bigint; unsigned int size; };
    • 已标记为答案 霁旻 2011年8月29日 3:11
    2011年8月29日 3:10

全部回复

  • strint长度是否肯定大于1?


    麻烦把正确答案设为解答。
    2011年8月29日 2:31
    版主
  • 我现在的默认构造,导致了创建一个对象时不一定用得着动态内存;可是我的析构仍然是按照使用了动态内存的方式进行的析构,极可能对一个不存在的内存析构,导致出现了vaild heap pointer.下面是我完善后的类 class biginteger { public: biginteger(const string& strint="-0") { if('-'==strint[0] || '+'==strint[0]) { if('0'==strint[1]) { if(2==strint.size()) { size=2; bigint=new unsigned int[2]; bigint[0]=10; bigint[1]=strint[1]-'0'; } if(strint.size()>2) { cout<<"第一位数字不能为0!!!,将初始化为0"<<endl; size=2; bigint=new unsigned int[2]; bigint[0]=10; bigint[1]=0; } } else { size=strint.size(); bigint=new unsigned int[size]; for(int i=1;i<size;++i) { if('-'==strint[0]) { bigint[0]=11; } if('+'==strint[0]) { bigint[0]=10; } bigint[i]=strint[i]-'0'; } } } if('0'==strint[0]) { if(1==strint.size()) { cout<<"第一位数字不能为0!!!,将初始化为0"<<endl; size=2; bigint=new unsigned int[2]; bigint[0]=10; bigint[1]=0; } if(strint.size()>1) { size=2; bigint=new unsigned int[2]; bigint[0]=10; bigint[1]=0; } } if(strint[0]<='9' && strint[0]>='1') { size=strint.size()+1; bigint=new unsigned int[size]; bigint[0]=10; for(int i=1;i<size;++i) { bigint[i]=strint[i-1]-'0'; } } } biginteger(const unsigned int * ai,const unsigned int bs) { size=bs; bigint=new unsigned int[size]; for(int i=0;i<size;++i) { bigint[i]=ai[i]; } } biginteger(const biginteger& bi) { size=bi.size; bigint=new unsigned int[size]; for(int i=0;i<size;++i) { bigint[i]=bi.bigint[i]; } } ~biginteger() { delete[] bigint; } biginteger biabs() { if(11==bigint[0]) { bigint[0]=10; return *this; } return *this; } biginteger& operator=(const biginteger& b) { if(this==&b) { return *this; } delete[] bigint; size=b.size; bigint=new unsigned int[b.size]; for(int i=0;i<b.size;++i) { bigint[i]=b.bigint[i]; } return *this; } public: unsigned int* bigint; unsigned int size; };
    • 已标记为答案 霁旻 2011年8月29日 3:11
    2011年8月29日 3:10