【问题标题】:Why the memory allocation failed when passing the pointer as argument为什么将指针作为参数传递时内存分配失败
【发布时间】:2019-08-09 09:10:55
【问题描述】:

我刚刚尝试了两段代码来为二维数组分配连续内存并使用 g++ 编译代码。第二段代码运行良好,但第一段代码会导致分段错误(核心转储)。第一段代码有什么问题以及为什么它们不同。

感谢您的帮助!

void mem_alloc2D(double **U, unsigned Nx, unsigned Ny) {
    U = new double*[Nx];
    U[0] = new double[Nx*Ny];
    for (unsigned r = 1; r < Nx; ++r)
        U[r] = U[0] + r*Ny;
}

double **mem_alloc2D(unsigned Nx, unsigned Ny) {
    double **U;
    U = new double*[Nx];
    U[0] = new double[Nx*Ny];
    for (unsigned r = 1; r < Nx; ++r)
        U[r] = U[0] + r*Ny;
    return U;
}

【问题讨论】:

  • 在第一个中,您通过值传递UU 的修改值对调用函数不可见。
  • new 的两次调用不可能分配连续的内存。
  • 指向的值通过引用传递。指针本身仍然是按值传递的,因此存储在指针中的地址只是用作源的指针的副本。它们具有相同的地址,指向同一个地方,但只有在您将副本更改为指向其他地方之前。
  • 处理这个问题的另一个技巧(也是指针追逐尼尔的警告):isocpp.org/wiki/faq/operator-overloading#matrix-subscript-op
  • 为什么反对票和关闭票?这个问题很清楚,包含产生问题的代码。

标签: c++ c++11 memory-management heap-memory


【解决方案1】:

在第一个 sn-p 中,您按值传递双指针。因此,当您调用 mem_alloc2D(p, Nx, Ny) 时,您传递的指针 p 在函数退出时不会“更新”。通过引用传递指针

void mem_alloc2D(double** &U, unsigned Nx, unsigned Ny)

应该让它工作。

在第二个 sn-p 中你返回一个新创建的指针,所以它工作正常。

【讨论】:

    猜你喜欢
    • 2021-01-22
    • 2021-05-13
    • 2023-03-04
    • 1970-01-01
    • 2014-11-26
    • 1970-01-01
    • 1970-01-01
    • 2012-01-24
    • 1970-01-01
    相关资源
    最近更新 更多