动态内存分配错误

时间:2015-08-22 11:25:45

标签: c++ pointers memory dynamic

我有一个char指针作为类的私有成员。我需要从文件中读取记录并将其插入到类数组中。首先,我需要先获取记录数,然后在运行时创建一个myStudent数组。然后插入所有记录。但是当我尝试使用set方法初始化name字段时,它给了我 Practise1(3278,0x7fff7287e300)malloc:对象0x100105578的错误:释放对象的错误校验和 - 对象可能在修改后被释放。在malloc_error_break中设置断点以调试错误

如果我使用调试器一步一步地运行程序,它完全正常,没有错误,但是如果我正常运行它,它给了我上面的错误。 (有时它可以工作,有时它不会)

以下是我的代码的一小部分:

myClass.h:

class myClass{
private:
char *name;
public:
  myClass();
  void setName(string);
}

myClass.cpp

myClass:: myClass(){}
void myClass::setName(string x){
  name = new char[x.length()+1];    //my xcode give me signal SIGBART here
  strcpy(name, x.c_str());
}

的main.cpp

int main(){
myClass *classArr;
int amountRecord = getRecord(); //check the number of record and return it(assuming it return 5)
classArr = new myClass[amountRecord];

  loadClassData("test.dat",classArr);

  }

void loadClassData(string filename,myClass *classArr){
ifstream ins(filename,ios::in);
int counter = 0;
string className;
string temp;
if(ins.good()){
    while(!ins.eof()){
        className = "";                     
            getline(ins, className,'\n');
            classArr[counter].setName(className);        
        counter++;
}
ins.close();
}

3 个答案:

答案 0 :(得分:1)

问题在于你在阅读时如何循环(参见Why is “while ( !feof (file) )” always wrong?了解原因)。

这导致循环迭代一个额外的时间,导致您使用越界索引到classArr数组,这导致未定义的行为和崩溃。

相反,例如while (std::getline(ins, className))

答案 1 :(得分:0)

在函数void myClass::setName(string x)中,您正在使用一个名为sName的变量。

我不知道它在哪里声明,但你应该使用函数中传递的变量x

答案 2 :(得分:0)

sName来自何处?我认为它应该是这样的。

myStudent::myStudent(){}
void myStudent::setName(string x){
  name = new char[x.length()+1];    //my xcode give me signal SIGBART here
  strcpy(name, x.c_str());
}