堆分配功能命中墙: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){ 

这是一个指向指针的指针。

+0

啊我看到了,所以我需要一个指针指针,因为arr不作为指针传递。在函数调用之后,arrayofpointers被删除,并且只有五个元素的空间。谢谢! – st4rgut

+0

顺便说一句我尝试了你的建议,并得到了一个错误:'arr声明为引用数组引用类型的字符串*&'引用指针和'没有可行的重载='指针指针 – st4rgut

+0

错误哪一行?如果使用'**',则必须将指针的地址传递给该行:add(&arrayofpointers,n,count);并在这里使用明星'* arr = big_brotha';如果您使用'*&',它应该按原样工作。 – Serge