C++ 删除字符数组指针会触发一个神秘的断点

C++ 删除字符数组指针会触发一个神秘的断点,c++,visual-studio,debugging,pointers,breakpoints,C++,Visual Studio,Debugging,Pointers,Breakpoints,我有下面的代码: #include<iostream> using namespace std; void test(char arr[], int size){ char* newA = new char[5]; delete[] arr; // this line cause the breakpoint arr = newA; } void main(){ char* aa = new char[5]; test(aa,5);

我有下面的代码:

#include<iostream>
using namespace std;


void test(char arr[], int size){
    char* newA = new char[5];
    delete[] arr; // this line cause the breakpoint
    arr = newA;
}

void main(){
    char* aa = new char[5];
    test(aa,5);
    aa[0] = 's';
}
#包括
使用名称空间std;
无效测试(字符arr[],整数大小){
char*newA=新字符[5];
delete[]arr;//此行导致断点
arr=newA;
}
void main(){
char*aa=新字符[5];
试验(aa,5);
aa[0]='s';
}
当我运行这段代码时,我看到索引0处的变量“aa”是“s”,然后触发断点


您正在通过值传递
arr
,因此此行

arr = newA;
对调用方没有影响。因此,您在此处读取的是已删除的数组:

aa[0] = 's';
这是未定义的行为。您可以通过三种方式解决此问题:

传递推荐信:

void test(char*& arr, int size) { .... }
返回指针:

char* test(char* arr, int size) {
  delete[] arr;
  return new char[5];

}

或者,更好的方法是,使用性能良好的标准库类型,例如通过值传递
arr
,因此此行

arr = newA;
对调用方没有影响。因此,您在此处读取的是已删除的数组:

aa[0] = 's';
这是未定义的行为。您可以通过三种方式解决此问题:

传递推荐信:

void test(char*& arr, int size) { .... }
返回指针:

char* test(char* arr, int size) {
  delete[] arr;
  return new char[5];

}

或者,更好的方法是使用性能良好的标准库类型,例如
std::string

如果
test()
的第一个参数是
char*
而不是
char[]
,是否有帮助?虽然指针和数组是相似的,但我可以看到在调用
delete[]
时可能会导致异常。如果
test()
的第一个参数是
char*
而不是
char[]
,是否有帮助?虽然指针和数组是相似的,但我可以看到在调用
delete[]
时可能会导致异常。谢谢,这非常有用。还有一个问题,为什么断点在我的Visual Studio中被触发,而在另一个Visual Studio中没有触发?谢谢,这非常有帮助。还有一个问题,为什么断点在我的Visual Studio中被触发,而在另一个Visual Studio中没有触发?