C++二维数组离散动态和连续动态空间申请

Posted Zetaa

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++二维数组离散动态和连续动态空间申请相关的知识,希望对你有一定的参考价值。

声明:仅个人小记

前言: 在不同的场合,有的时候希望能够直接动态申请大片的连续空间来使用,有的时候则希望将大片空间需求通过动态申请很多小片的连续空间来实现。注意:new 空间时候,即使返回不是NULL,空间分配也不一定成功,实际上是延迟分配空间,或者说是写时分配。

注意出现bug (segmentation fault )

下面这句代码(连续方式分配二维数组)中
,容易出现难以察觉的bug,即 i ∗ n i*n in可能溢出,因为 i i i是int类型, i ∗ n i*n in可能发生溢出,但这句代码中并不存在语法错误,同时这句代码被执行的时候也不会报错,只有在真正使用这片空间的时候才会发生segmentation fault错误(非法访问)。

for (int i = 0; i < m; i ++) A[i] = dataA+i*n;

正确书写为

for (long i = 0; i < m; i ++) A[i] = dataA+i*n;

离散方式动态申请二维数组

示意图
离散方式代码
#include <iostream>
using namespace std;

int main()

    int m = 1000, n = 2000;
    
    // 如果希望离散使用大量的动态空间
    // 申请
    double ** A = new double*[m];
    // 每次只申请 n*sizeof(double) 这么大的动态空间
    for (int i = 0; i < m; i ++) A[i] = new double[n]; 
    
    // ... ...
    
    // 释放
    for (int i = 0; i < m; i ++) delete []A[i];
    delete []A;

    return 0;

连续方式动态申请二维数组

示意图
连续方式代码(正确)
#include <iostream>
using namespace std;

int main()

    int m = 1000, n = 2000;
    // 如果希望连续使用大量的动态空间
    
    // 申请
    double ** A = new double*[m];
    double *dataA = new double[m*n];// 申请连续的 m*n*sizeof(double) 这么大的空间
    for (long i = 0; i < m; i ++) A[i] = dataA+i*n;
    
    // ... ...
    
    // 释放
    delete []A;
    delete []dataA;
    
    return 0;

连续方式代码(可能会引起bug,当分配大内存时候)
#include <iostream>
using namespace std;

int main()

    int m = 1000, n = 2000;
    // 如果希望连续使用大量的动态空间
    
    // 申请
    double ** A = new double*[m];
    double *dataA = new double[m*n];// 申请连续的 m*n*sizeof(double) 这么大的空间
    for (int i = 0; i < m; i ++) A[i] = dataA+i*n;
    
    // ... ...
    
    // 释放
    delete []A;
    delete []dataA;
    
    return 0;

结语

代码编写起来,连续方式代码量更少逻辑更简洁,在进行矩阵深度拷贝的时候也是很有优势,同时效率也会更高些,因为申请内存的这个动作只需要两次,而离散申请方式则需要进行很多次的动态内存申请,在内存不打紧的情况下,个人建议直接使用连续方式,我目前觉得不错。

以上是关于C++二维数组离散动态和连续动态空间申请的主要内容,如果未能解决你的问题,请参考以下文章

C++ new申请二维数组整理

c++中的new()申请二维数组

c语言问题:c语言中二维数组在内存中怎样存储?

C++动态申请数组问题

c++ 用户输入 2个值 定义二维数组 但是报错

c++中new和delete的用法