的用C新存储器范围++(Scope of new memory in C++)

2019-06-24 06:07发布

当我尝试做以下我得到一个错误说我试图读取或写入受保护的内存。

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

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

这是合法的吗?

Answer 1:

不,你正在犯一个共同的错误初学者。 你没有记住,指针只是由价值,除非你要求一个引用或指针传递这些变量。 更改签名的函数来void func1(int *& ptr)



Answer 2:

更改您的签名:

void func1(int *& ptr)

你是按值传递的指针,所以外界ptr不会得到改变。 因此,这就像做

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

这是非法的,因为ptr_a未初始化。



Answer 3:

您按传递的指针。 这意味着该功能的工作原理与指针调用者的指针的本地副本。 所以你在函数赋值不能被调用者看到。

引用传递它,而不是让该功能可以分配给调用者的指针,而不是分配给一个本地副本。

void func1(int* &ptr)

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

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

我更喜欢后者的做法。



文章来源: Scope of new memory in C++