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