分配时的C ++分段错误

时间:2014-09-17 11:19:54

标签: 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,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 = new SUData [size];但它仍然相同

2 个答案:

答案 0 :(得分:1)

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

更大的问题是,作为所有参数,指针按值传递 ,即readSQL函数仅在副本上运行来自InitalizeUserActivity的指针。在readSQL函数内更改指针时,仅更改副本。这当然会导致您将数据读入无法从readSQL函数外部访问的内存中。

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

答案 1 :(得分:0)

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