内存管理-c++中的分配大小限制
memory management - size limit of allocation in c++?
我用它在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::matrix
或Eigen 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阵列(例如,请参阅此比较),处理您不想自己重新访问的功能、问题和优化(除非您真的知道自己在做什么或真的需要一些简单的东西)。您只需要为每个特定的应用程序找到适合您需要的库。
- 当分配一个字符串值并稍后通过分配另一个值进行更改时C++如何管理内存?
- 任务管理器 - C/C++ 应用程序 - 分配的地址空间与已用内存
- 是否可以在专用内存空间中分配一个为提升管理共享内存而创建的对象
- 哪些资源是由智能指针管理的,而它们的内存不是由new分配的
- 管理矢量分配的内存
- 内存管理 - 添加小部件是否分配父级
- C++ 使用 brk() 系统调用分配内存的自定义内存管理
- 动态分配的shared_ptr可以通过其管理的对象的 dtor 删除自身吗?
- 二维数组分配中的内存管理
- 管理未动态分配的内存
- 如何管理返回到 QML 的动态分配的 QObject 的生存期
- C++内存管理问题(分配大量内存,但从不释放内存)
- 如何完全管理像map这样的std容器的堆内存分配
- 使用智能指针管理函数内分配的内存
- 尝试使用while循环取消分配向量,任务管理器显示内存使用正在增加
- 在设置断点的Windows上进行分配、释放和内存管理
- 管理带有预分配内存和数组的析构函数
- 使用boost::pool管理std::vector中的内存分配
- 如何正确管理动态分配对象的内存
- 内存管理:使用new操作符进行数组和动态分配