内存管理-c++中的分配大小限制

memory management - size limit of allocation in c++?

本文关键字:分配 管理 -c++ 内存      更新时间:2023-10-16

我用它在cpp:中分配一个2D数组

int s[n][2];

但似乎当n非常大(最多1e6)时,会产生运行时错误(exitcode:11)。

如何解决这个问题?

这不是动态分配。此外,如果n是一个变量,它甚至不是有效的ANSI C++,因为您不能声明具有可变项数的数组。

要正确地动态分配,请考虑使用std::vector

#include <vector>
//...
// Simulate s[n]
std::vector<std::vector<int>> s(n, std::vector<int>(2));
//..
// You can now use s similar to a 2 dimensional array.

如果出于某种原因,您要求二维数组的数据是连续的,请考虑以下答案:

如何在c++中创建一个连续的2d数组?

您在堆栈上进行分配,并且会出现堆栈溢出。

你需要像这样分配你的2d阵列

int** ary = new int*[sizeY];
for(int i = 0; i < sizeY; ++i)
ary[i] = new int[sizeX];

请参阅如何使用new在C++中声明2d数组?

或者更好的是,使用Boost::ublas::matrixEigen Vector2d,或者正如Paul McKenzie建议的那样,使用std::vector(最简单的)

在堆栈上分配内存的声明类型。那可能太大了。使用REAL动态分配(new int[n])。

正如另一位所说,您遇到的"问题"是因为您没有使用动态内存分配。

@{Straight Line}向您展示了一个创建2d阵列的类似C的解决方案,而@PaulMcKenzie向您展示的是一个使用向量的解决方案并提出了连续存储的问题。但是,后者不同,因为它不限制列的大小(假设[row][col]索引)。

@dasblinkenlight的答案向您展示了如何创建自己的2d数组类;我认为这就是C++的本质,可以定义自己想要如何管理内存,并在代码中公开一组可公开访问的方法来与这个"对象"交互。大小为n x p的2d数组无非是由两个下标索引的np元素,所以这就是您应该编写的代码。这里有一个接近最小的例子来说明如何做到这一点:

#include <new>
template <class T>
class Array2D
{
public:
    Array2D() 
        : m_ptr(NULL)
        { clear() }
    ~Array2D()
        { clear(); }
    void clear() 
    { 
        // free current allocation if any
        if (m_ptr) 
            delete[] m_ptr; 
        // reset member variables
        m_ptr = NULL; 
        m_nrows = m_ncols = 0; 
    }
    inline unsigned nrows() const { return m_nrows; }
    inline unsigned ncols() const { return m_ncols; }
    void set_size( unsigned nr, unsigned nc ) 
    { 
        // clear any previous allocation
        clear(); 
        // new allocation
        m_ptr   = new T[nr*nc];
        m_nrows = nr;
        m_ncols = nc;
    }
    // access elements using [row][col]
    inline T* operator[] ( unsigned row )
        { return &m_ptr[ row*n_cols ]; }
    // access elements using (row,col)
    inline T& operator() ( unsigned r, unsigned c )
        { return m_ptr[ c + n_cols*r ]; }
protected:
    T *m_ptr;
    unsigned m_nrows, m_ncols;
};

如果你知道你会经常使用矩阵,你的第一反应应该是检查已经存在的矩阵。有许多成熟的C++库可以实现2d阵列(例如,请参阅此比较),处理您不想自己重新访问的功能、问题和优化(除非您真的知道自己在做什么或真的需要一些简单的东西)。您只需要为每个特定的应用程序找到适合您需要的库。