【问题标题】:Dynamic memory allocation error动态内存分配错误
【发布时间】:2015-08-22 11:25:44
【问题描述】:

我有一个 char 指针作为类的私有成员。我需要从文件中读取记录并将其插入到类数组中。首先,我需要先获取记录数,然后在运行时创建一个 myStudent 数组。然后插入所有记录。但是当我尝试使用 set 方法初始化名称字段时,它给了我 Practise1(3278,0x7fff7287e300) malloc:error for object 0x100105578: wrong checksum for freed object - object was possible modified after被释放。在 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();
}

【问题讨论】:

  • 你在这里使用字符数组而不是std::string有什么原因?
  • 是的,这是我的实验室任务要求
  • 关于你的问题,你“从文件中读取记录”怎么办?问题很可能出在您显示的代码中,因为它实际上不在您显示的代码中。您应该尝试创建一个Minimal, Complete, and Verifiable Example 并向我们展示。
  • @JoachimPileborg 我已经彻底检查了这个问题,如果我定义了一个字符数组(不是指针),例如 char name[30] 它工作得很好。我猜问题出在名称指针和初始化它的方式上。
  • 好的,我们可以看看这个吗?我猜问题出在某处

标签: c++ pointers memory dynamic


【解决方案1】:

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

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

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

【讨论】:

  • 我有一个额外的函数来检查空行等,我使用调试器进行检查,它循环的数量与记录相同。有趣的是,如果我使用调试器打印结果,它工作得非常好。
  • @carrotpie 请尝试更改循环,例如我在更新的答案中显示的内容。检查它是否工作得更好,因为你现在所做的根本不会像你期望的那样工作。
  • 同样的错误,它使我的程序每次循环时都跳过从 .dat 文件中读取一行
  • Jaochims 对,将 while 循环更改为他建议的那样,然后删除您之前调用的 getline 函数。我猜你把它留在里面了,这就是为什么它会跳行并给你同样的错误。
【解决方案2】:

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

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

【讨论】:

  • 抱歉我打错了,应该是 x,不是 sName
【解决方案3】:

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());
}

【讨论】:

  • 对不起,我在示例中打错了,它应该是 x,而不是 sName
  • 您正在尝试获取整数,但您正在使用 char 进行操作。用另一种方式来做。你的问题是 setname 函数。修复它
猜你喜欢
  • 2020-01-14
  • 2011-02-26
  • 2021-08-23
  • 2011-02-17
  • 1970-01-01
  • 2016-05-14
  • 2019-04-26
相关资源
最近更新 更多