C++分割故障分配

C++分割故障分配,c++,memory-management,allocation,C++,Memory Management,Allocation,在这之前,我搜索了很多导致分割错误的原因,但是我没有找到任何关于我的情况的信息 事情是这样的: DNA_INIT Creation::InitalizeUserActivity() { SUData *curr = new SUData[__USERCOUNT]; readSQL(curr,__USERCOUNT); // return something } 我在dna.h中有这个函数,这是它的文件,名为dna.cpp SUData *readSQL(SUData *tmp,in

在这之前,我搜索了很多导致分割错误的原因,但是我没有找到任何关于我的情况的信息

事情是这样的:

DNA_INIT Creation::InitalizeUserActivity()
{
  SUData *curr = new SUData[__USERCOUNT];
  readSQL(curr,__USERCOUNT);
  // return something
}
我在dna.h中有这个函数,这是它的文件,名为dna.cpp

SUData *readSQL(SUData *tmp,int size)
{
  ifstream getSQL;
  getSQL.open("../noSQL/StoredUserDataNoSQL.inc");

  int count;
  string tmpstr;

  ifstream focus;
  focus.open("../instruction.bin",ios::app);
  focus >> tmpstr >> count;
  focus.close();

  int c = 0;
  tmp = new SUData[size];

  while(getSQL >> tmp[c].id >> tmp[c].access >> tmp[c].u_name >> 
    tmp[c].u_surname >> tmp[c].u_username >> tmp[c].u_password 
    >> tmp[c].u_email )
    {
      c++;
    }

  return tmp;
}
当我试图执行时,它给了我一个错误。我试过了,但还是一样。谢谢你的建议


编辑:我删除了tmp=newsudata[size];但是还是一样的

首先为curr分配一个空间,并将其发送到函数readSql,然后再次为tmp变量分配另一个空间;tmp在curr中保留分配的地址,这是错误的,您不需要重新分配。

啊,现在我看到了问题:您在initializeUserActivity中分配一个指针,将其传递给readSQL,它再次分配,导致内存泄漏

更大的问题是,与所有参数一样,指针是按值传递的,即readSQL函数仅对initializeUserActivity中指针的副本进行操作。在readSQL函数中更改指针时,只更改副本。这当然会导致您将无法从readSQL函数外部访问的数据读入内存


有一个非常简单的方法可以解决这个问题,那就是不要在readSQL函数中分配任何新的内容,因为它已经分配了。

USERCOUNT有多大?你确定吗;够了吗?您的问题是关于分配-哪一行导致了问题?为什么要以追加模式打开输入流?另外,它的名字是../instruction.bin,它是一个二进制文件,所以也许你应该以二进制模式打开它?至于你的问题,每当你的程序崩溃时,你应该在调试器中运行它的调试版本。调试器将在崩溃的位置停止,并允许您检查和遍历函数调用堆栈,还允许您检查变量的值。请在调试器中运行您的程序,并告诉我们它在哪里崩溃。还有一件事需要考虑,如果../noSQL/StoredUserDataNoSQL.inc文件中的数据比变量大小指示的数据多怎么办?然后,您将在为tmp分配的内存之外进行写入,这将导致。例如,当我删除tmp=newsudata[size]时,您可能应该有whilec.@doctorlove它仅仅是4;它不会改变仍然相同的情况没关系,它的实现错误,你不能调试你的代码?我不希望程序因为重复分配而在那里兑现。当然,当它试图使用读入调用方当前数据的假定信息时,它可能会崩溃。为什么您认为c不超过您的大小?变量c,您确定文件中的行号不大于u usercount清楚的解释,那么如何解决这个问题,我的意思是我想在readSQL函数中更改curr,怎么做呢?@SashaValentine只是不在readSQL函数中再次分配。如果释放InitializeUserActivity中分配的内存,并将数据读入InitializeUserActivity函数中分配的内存,则不会出现内存泄漏。@Sasha或者您没有将分配的数据传递给函数,而是在函数中分配并返回在函数中分配的内存;或者按照Joachim的建议:将分配的内存传递到函数中,不在函数内部重新分配,并且,我可以补充一点,不返回任何内容——为什么?tmp的值在函数外部设置,未更改。