好吧,在此之前我搜索了很多关于"是什么导致了分段错误",但我没有发现任何关于我的情况。
这是事情:
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];但它仍然相同
答案 0 :(得分:1)
啊,现在我看到了问题:您在InitalizeUserActivity
中分配了一个指针,将其传递给readSQL
再次分配(导致内存泄漏)。
更大的问题是,作为所有参数,指针按值传递 ,即readSQL
函数仅在副本上运行来自InitalizeUserActivity
的指针。在readSQL
函数内更改指针时,仅更改副本。这当然会导致您将数据读入无法从readSQL
函数外部访问的内存中。
有一种非常简单的方法可以解决这个问题,那就是不在readSQL
函数中分配任何新内容(因为它已经分配了)。
答案 1 :(得分:0)
首先,您为curr
分配一个空格并将其发送到函数readSql
,然后再为tmp
变量分配另一个空格; tmp
在curr
中保留已分配的地址,错误的是您不需要重新分配。