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