C++中新内存的范围

sal*_*ano 3 c++ memory-leaks memory-management

当我尝试执行以下操作时,我收到一条错误消息,说我正在尝试读取或写入受保护的内存.

void func1(int * ptr) {
    int *ptr_b = new int[5];
    ptr = ptr_b; 
}

void main() {
    int *ptr_a;
    func1(ptr_a);
    delete [] ptr_a;
}
Run Code Online (Sandbox Code Playgroud)

这合法吗?

Edw*_*nge 9

不,你是一个普通的初学者错误.你不记得指针只是通过值传递的变量,除非你要求引用或指向它们.将功能的签名更改为void func1(int *& ptr)


Luc*_*ore 7

将您的签名更改为:

void func1(int *& ptr)
Run Code Online (Sandbox Code Playgroud)

您按值传递指针,因此外部ptr不会更改.所以这就像在做

int main() {  // <--- main returns int
    int *ptr_a;
    delete [] ptr_a;
}
Run Code Online (Sandbox Code Playgroud)

这是非法的,因为ptr_a没有初始化.