【问题标题】:Scope of new memory in C++C ++中新内存的范围
【发布时间】:2012-05-16 04:06:48
【问题描述】:

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

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

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

这合法吗?

【问题讨论】:

标签: c++ memory-management memory-leaks


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    将您的签名更改为:

    void func1(int *& ptr)
    

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

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

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

    【讨论】:

    • 我的意思是,既然void main() 不是合法的 C++,我们应该提供 with 合法的 C++ 的示例。请参阅问题 cmets 中的链接了解我的意思。
    【解决方案3】:

    您通过传递了指针。这意味着该函数使用的指针是调用者指针的本地副本。所以调用者看不到你在函数中分配的值。

    通过 reference 传递它,以便函数可以分配给调用者的指针,而不是分配给本地副本。

    void func1(int* &ptr)
    

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

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

    我更喜欢后一种方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-09
      • 1970-01-01
      • 1970-01-01
      • 2017-06-22
      • 2014-06-08
      • 1970-01-01
      • 1970-01-01
      • 2021-09-17
      相关资源
      最近更新 更多