【问题标题】:I am having a _BLOCK_TYPE_IS_VALID(pHEAD-> nBlockUse) error我遇到 _BLOCK_TYPE_IS_VALID(pHEAD-> nBlockUse) 错误
【发布时间】:2015-03-26 14:43:31
【问题描述】:

这是我的代码,它给我一个断言错误。我真的不知道这是什么意思。这是我第一次遇到这样的问题。

#include <iostream>
#include "string.h"
using namespace std;

class myString {
private:
   // these functions are not
   // needed outside the class
   void allocate(int);
   void copy(char *, char *);
   char *string;
public:   
   // member functions
   myString();
   myString(char *);
   int getLength();
   int getLength(char *);
   void empty();
   bool isEmpty();
   void putString(char *);
   char *getString();
   char *fromLeft(int);
   char *fromRight(int);
   char *fromMid(int, int);
   ~myString();
};

//--------------------------------
//------------MEMBER--------------
//---FUNCTION DEFINITION STARTS---
void myString::allocate(int size)
    { empty();
      string=new char[size];
      if(string==NULL) exit(0); }

void myString::copy(char *str1, char *str2)
   { int length=getLength(str2);
    for(int i=0;i<=length;i++)
      str1[i]=str2[i]; }

   void myString::empty()
   {
    if(string!=NULL)
      {
       delete []string;
       string=NULL;
      }
   }

   bool myString::isEmpty()
   {
    if(string!=NULL)
       return false;

    return true;
   }

  int myString::getLength(char *str)
  {
   int i=0;

   while(str[i]!='\0')
     i++;

   return i;
  }

  int myString::getLength()
  {
   if(string!=NULL)
     return getLength(string);

   return -1;
  }

  myString::myString(char *str)
  {
   string=NULL;
   int size=getLength(str)+1;

   allocate(size);

   copy(string,str);
  }

  myString::myString()
  {
   string=NULL;
  }

  void myString::putString(char *str)
  {
   int size=getLength(str)+1;

   allocate(size);

   copy(string,str);
  }

  char *myString::getString()
  {
   if(string!=NULL)
     {
      return string;
     } else return NULL;
  }

  myString::~myString()
  {
   if(string!=NULL)
     delete []string;
  }

  char *myString::fromLeft(int chr)
  {
   if(string!=NULL)
     {
      char *temp;
      temp=new char[chr+1];// account for NULL character
    int i;
      if(temp==NULL) exit(1);// can't get memory

      for( i=0;i<chr;i++)
        temp[i]=string[i]; // copy chr number of characters
        temp[i]='\0';  // terminate it
      return temp;
     }else return NULL;
  }

  char *myString::fromRight(int chr)
  {
   if(string!=NULL)
     {
      char *temp;
      temp=new char[chr+2];
      int a=0;

      if(temp==NULL) exit(1);

      int i=getLength()-1;
      int j=(i-chr)+1;

      for(j;j<=i;j++)
        {
         temp[a]=string[j];
         a++;
        }
   temp[a]='\0';
   return temp;
     }
else return NULL;  }

  char *myString::fromMid(int a,int b)
  {
   if(string!=NULL)
     {
      int size=b+1;
      char *temp;
      temp=new char[size];
      int i=a,j=0,k=(a+b);

      for(i;i<k;i++)
        {
         temp[j]=string[i];
         j++;
        }
   temp[j]='\0';
   return temp;
     }
else return NULL;  }
   //-----------MEMBER-------------
   //---FUNCTION DEFINITION ENDS---
   //------------------------------

class Month {
private: 
    myString monthName;
    int monthNumber;
public:
    Month() 
        { monthNumber=1; monthName.putString("January"); }
    Month(char *s) 
        { 
            monthName.putString(s);
            if (strcmp(s,"January")==0)  monthNumber=1; 
            if (strcmp(s,"February")==0) monthNumber=2;
            if (strcmp(s,"March")==0) monthNumber=3;
            if (strcmp(s,"April")==0) monthNumber=4;
            if (strcmp(s,"May")==0) monthNumber=5;
            if (strcmp(s,"June")==0) monthNumber=6;
            if (strcmp(s,"July")==0) monthNumber=7;
            if (strcmp(s,"August")==0) monthNumber=8;
            if (strcmp(s,"September")==0) monthNumber=9;
            if (strcmp(s,"October")==0) monthNumber=10;
            if (strcmp(s,"November")==0) monthNumber=11;
            if (strcmp(s,"Decevember")==0) monthNumber=12;
        }
    Month(int n)        {
        monthNumber=n;
        if (monthNumber==1) monthName.putString("January");
        if (monthNumber==2) monthName.putString("February");
        if (monthNumber==3) monthName.putString("March");
        if (monthNumber==4) monthName.putString("April");
        if (monthNumber==5) monthName.putString("May");
        if (monthNumber==6) monthName.putString("June");    
        if (monthNumber==7) monthName.putString("July");
        if (monthNumber==8) monthName.putString("August");
        if (monthNumber==9) monthName.putString("September");
        if (monthNumber==10) monthName.putString("October");
        if (monthNumber==11) monthName.putString("November");
        if (monthNumber==12) monthName.putString("December");
    }
    void SetMonthNumber(int n) { monthNumber=n; 

        if (monthNumber==1) monthName.putString("January");
        if (monthNumber==2) monthName.putString("February");
        if (monthNumber==3) monthName.putString("March");
        if (monthNumber==4) monthName.putString("April");
        if (monthNumber==5) monthName.putString("May");
        if (monthNumber==6) monthName.putString("June");
        if (monthNumber==7) monthName.putString("July");
        if (monthNumber==8) monthName.putString("August");
        if (monthNumber==9) monthName.putString("September");
        if (monthNumber==10) monthName.putString("October");
        if (monthNumber==11) monthName.putString("November");
        if (monthNumber==12) monthName.putString("December");  
    }
    void SetMonthName(char *s) { monthName.putString(s);

        if (strcmp(s, "January")==0) monthNumber=1;
        if (strcmp(s, "February")==0) monthNumber=2;
        if (strcmp(s, "March")==0) monthNumber=3;
        if (strcmp(s, "April")==0) monthNumber=4;
        if (strcmp(s, "May")==0) monthNumber=5;
        if (strcmp(s, "June")==0) monthNumber=6;
        if (strcmp(s, "July")==0) monthNumber=7;
        if (strcmp(s, "August")==0) monthNumber=8;
        if (strcmp(s, "September")==0) monthNumber=9;
        if (strcmp(s, "October")==0) monthNumber=10;
        if (strcmp(s, "November")==0) monthNumber=11;
        if (strcmp(s, "December")==0) monthNumber=12; 
    }        
    int GetMonthNumber() const 
        {return monthNumber;}
    myString GetMonthName() const 
        { return monthName; } 
    Month & operator ++()         {  // prefix
        monthNumber++; 
        SetMonthNumber(monthNumber); 
        return *this;
    }
    Month  operator++(int){
        Month Temp; 
        Temp=*this; 
        monthNumber++;
        SetMonthNumber(monthNumber);
        return Temp;
    }// Postfix 

    Month & operator --() {
        monthNumber--;
        SetMonthNumber(monthNumber);
        return *this;
    }
    Month operator--(int) {
        Month Temp;
        Temp=*this;
        monthNumber--;
        return Temp;
    }    
    friend ostream & operator<<(ostream & O, Month a);
    //friend istream & operator>>(istream & I, Month a);
};

ostream & operator<<(ostream & O, Month a) {
    O << a.monthNumber << " " << a.monthName.getString();
        return O; 
    }

istream &operator >> (istream &is, Month &a)    //cin operator overload
    {
        int num;
        char name[12];
        is >> num;
        is >> name;

        a.SetMonthNumber(num);
        a.SetMonthName(name);
        return is;
    }



int main()
{   
    Month M;        
    char name[12];
    int num;
    cout << M << endl;
    M++;
    cout << M << endl;   
    M.SetMonthNumber(5);
    cout << M << endl;    
    cout << "Enter a month name  ex: January" << endl;
    cin >> name;
    M.SetMonthName(name);
    cout << M << endl;
    cout << "Enter a month number (1-12)" << endl;
    cin >>  num;
    M.SetMonthNumber(num);
    cout << M << endl;   
    cout << " Enter a month number and name  ex: 2 February  or  3 March" << endl;
    cin >> M;
    cout << M << endl;
    int pause;
    cin >> pause;
    return 0;
}

【问题讨论】:

  • 请形成一个MCVE(调试它会立即告诉您哪一行代码触发了断言)然后查看网站上的相关问题,看看您的基本问题是否相同。这个错误有很多问题,所以当您的代码不是 90% 专有时,您可能会发现一些问题。
  • 您可能忘记创建一个复制构造函数,导致内存双重释放。但更重要的是,看起来您在开始测试字符串类之前编写了太多代码。

标签: c++ project monthcalendar


【解决方案1】:

您必须从方法 empty() 中删除删除。 delete 应该是析构函数的一部分。请看新定义

void myString::empty()

{

if(string!=NULL)

  {

   string=NULL;

  }

}

【讨论】:

    猜你喜欢
    • 2011-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-31
    • 2015-02-11
    • 2015-09-22
    • 2013-11-10
    • 1970-01-01
    相关资源
    最近更新 更多