C++ 堆分配函数撞墙:EXC错误访问代码1

C++ 堆分配函数撞墙:EXC错误访问代码1,c++,arrays,heap,C++,Arrays,Heap,我正在使用动态堆分配创建一个教室工具来添加学生。程序提示用户/教师输入学生姓名,并将其分配到数组中 我测试了while循环,该循环调用负责分配更大堆数组的add函数。程序输出按预期添加的学生列表,并可以创建更大的堆数组 但是,当我尝试添加第11名学生时,我收到以下消息THRD 1 EXC\u BAD\u ACCESS code 1。我读到这意味着程序不能再访问内存块,但我不明白为什么会在第11个学生身上发生这种情况?非常感谢对调试的任何建议。谢谢你的耐心,我还是习惯C++ /* Dynamic

我正在使用动态堆分配创建一个教室工具来添加学生。程序提示用户/教师输入学生姓名,并将其分配到数组中

我测试了
while
循环,该循环调用负责分配更大堆数组的
add
函数。程序输出按预期添加的学生列表,并可以创建更大的堆数组

但是,当我尝试添加第11名学生时,我收到以下消息
THRD 1 EXC\u BAD\u ACCESS code 1
。我读到这意味着程序不能再访问内存块,但我不明白为什么会在第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;
}
/*
使用指针的动态堆分配
*/
#包括
#包括
使用名称空间std;
无效添加(字符串arr[],内部和螺柱,内部和计数器){
//将学生姓名复制到更大的数组中
螺柱+=10;//vs通过值传递
string*big_BOOLOA=新字符串[螺柱];//支架

for(int i=0;i在您的示例中,将“arrayofpointers”作为“arr”复制到您的函数中。您删除了它的内容(去掉它一直指向的内容)然后为其分配一个新值。但是,将该值分配给“arr”,而不是分配给arrayofpointers。因此,arrayofpointers上的下一个操作将引用已删除的内存

你真正需要的是这样的东西:

void add(string *&arr,int& studs,int& counter){
这将创建对指针的引用

或者这个:

void add(string **arr,int& studs,int& counter){

这是指向指针的指针。

aah我明白了,所以我需要指向指针的指针,因为arr不是作为指针传递的。arrayofpointers在函数调用后被删除,并且只有五个元素的空间。谢谢!顺便说一句,我尝试了您的建议,每个元素都有一个错误:
arr声明为string*&对于指向指针的指针和
无可行重载=
对于指向指针的指针,哪一行的错误?如果使用“**”,则必须将指针的地址传递到该行:add(&arrayofpointers,n,count);并在此处使用星号“*arr=big_-bolota”;如果使用“*&”,则应按原样工作。对于“**”,还需要这个:big_-bolota[i]=(*arr)[i];谢谢,我用一个星号使它工作:
void add(string*arr[],int&studs,int&counter){//将学生姓名复制到更大的数组studs+=10;//vs通过值字符串传递*big\u bologa=新字符串[studs];//用于(int i=0;i)的保持符