C++ C+中新内存的范围+;

C++ C+中新内存的范围+;,c++,memory-management,memory-leaks,C++,Memory Management,Memory Leaks,当我尝试执行以下操作时,会出现一个错误,表示我正在尝试读取或写入受保护的内存 void func1(int * ptr) { int *ptr_b = new int[5]; ptr = ptr_b; } void main() { int *ptr_a; func1(ptr_a); delete [] ptr_a; } 这合法吗?将您的签名更改为: void func1(int *& ptr) 您正在按值传递指针,因此外部ptr不会被更改

当我尝试执行以下操作时,会出现一个错误,表示我正在尝试读取或写入受保护的内存

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

void main() {
    int *ptr_a;
    func1(ptr_a);
    delete [] ptr_a;
}

这合法吗?

将您的签名更改为:

void func1(int *& ptr)
您正在按值传递指针,因此外部
ptr
不会被更改。所以这就像

int main() {  // <--- main returns int
    int *ptr_a;
    delete [] ptr_a;
}

int main(){/否。您犯了一个初学者常见的错误。您不记得指针只是按值传递的变量,除非您请求引用或指向它们的指针。请将函数的签名更改为
void func1(int*&ptr)

按值传递指针。这意味着函数使用的指针是调用方指针的本地副本。因此调用方看不到在函数中指定的值

改为通过引用传递,以便函数可以分配给调用方的指针,而不是分配给本地副本

void func1(int* &ptr)

或者,也许考虑返回新分配的指针:

int* func1()
{
    return new int[5];
}

我更喜欢后一种方法。< /P>不要使用<代码>无效的主()/<代码>:你应该通过引用来传递指针,但是,我看,“如何使用代码>空主机())/>代码不是合法的C++,我们应该提供合法C++的例子。