堆分配功能命中墙:EXC BAD ACCESS CODE 1
问题描述:
我使用动态堆分配来创建教室工具来添加学生。程序提示用户/老师输入学生姓名,并将其分配给一个数组。堆分配功能命中墙:EXC BAD ACCESS CODE 1
我测试了while
循环,它调用add
函数负责分配更大的堆阵列。该程序输出按预期方式添加的学生列表,并可创建更大的堆阵列。
但是,当我尝试添加第11个学生时,我收到此消息THRD 1 EXC_BAD_ACCESS code1
。我读到这意味着程序无法再访问内存块,但是为什么这会发生在第11个学生?任何有关调试的建议都非常感谢。感谢您的耐心,我仍然习惯C++
/*
Dynamic Heap Allocation using pointers
*/
#include <iostream>
#include <string>
using namespace std;
void add(string arr[],int& studs,int& counter){
//copies student names to a bigger array
studs+=10; //vs passing by value
string* big_brotha = new string[studs]; // a holder
for(int i=0;i<counter;i++){
big_brotha[i]=arr[i];
}
delete[] arr;
arr = big_brotha;
}
int main() {
int n=5;
int count=0;
string name;
bool cont = true;
char option;
string* arrayofpointers = new string[n];
cout << "enter student names. Enter Q to quit " << endl;
while (cont){
cout << "enter student name for seat number " << count << endl;
cin >> name;
if (name=="Q"){
for (int i=0;i<count;i++){
cout << arrayofpointers[i] << endl;
}
break;
}
cout << "is the counter less than array size? " << (count<n) << endl;
if (count>=n){ //time to make the array bigger!
cout << "time to make the array bigger!" << endl;
add(arrayofpointers,n,count);
cout << "the array is now this big " << n << endl;
arrayofpointers[count]=name;
}
else{
arrayofpointers[count]=name; //no longer possible to access memory
}
count++;
}
return 0;
}
答
在你的情况“arrayofpointers”是复制到您的功能为“改编”。你删除它的内容(摆脱它指向的内容),然后为它分配一个新值。但是,您将值分配给'arr',而不是数组指针。因此,arrayofpointers上的下一个操作将引用已删除的内存。
你真正需要的是这样的:
void add(string *&arr,int& studs,int& counter){
这将创建一个指针引用。
或该:
void add(string **arr,int& studs,int& counter){
这是一个指向指针的指针。
啊我看到了,所以我需要一个指针指针,因为arr不作为指针传递。在函数调用之后,arrayofpointers被删除,并且只有五个元素的空间。谢谢! – st4rgut
顺便说一句我尝试了你的建议,并得到了一个错误:'arr声明为引用数组引用类型的字符串*&'引用指针和'没有可行的重载='指针指针 – st4rgut
错误哪一行?如果使用'**',则必须将指针的地址传递给该行:add(&arrayofpointers,n,count);并在这里使用明星'* arr = big_brotha';如果您使用'*&',它应该按原样工作。 – Serge