【发布时间】:2014-08-28 15:41:36
【问题描述】:
假设定义了以下数据结构typedef std::vector<std::vector<int> > MYARRAY。那么对于变量MYARRAY var,在将数据推入其中之前,如何为该变量分配内存。例如,
std::vector<int> p1;
p1.push_back(1);
p1.push_back(2);
std::vector<int> p2;
p2.push_back(22);
p2.push_back(33);
var.push_back(p1);
var.push_back(p2);
如果我们不为var分配内存,那么它会自动分配内存。那么如何在将数据推送到内部之前为这个 var 分配内存呢?如果是std::vector<int> var2,我可以在使用前使用var2.reserve(n)分配内存。
编辑: 提出了两个建议,但都不起作用:
- 解决方案 1:为每个元素分配内存
var.reserve(3); for(int i=0; i
我用VC 2010在debug模式下编译运行代码,报错如下:
-
方案2:一开始就创建对象
std::vector<std::vector<int> > var(3, std::vector<int>(5));创建此变量后,您可以在 VC 2010 中看到此变量: 它的内容已经存在。因此,如果您在此变量上推送数据,它将再次分配内存。
编辑 2:
有人对为什么我在使用这个变量之前需要分配内存感兴趣,主要是因为windows的运行时库。变量var在可执行程序中定义为空变量,其内容由动态库中定义的函数给出。如果两者都使用动态运行时库,那将不是问题。但在我的情况下,两者都与静态运行时库链接,这意味着每个模块都负责其内存分配。由于var 是在可执行程序中定义的,它还应该注意其内存分配。
【问题讨论】:
-
那么
var.reserve(n)...有什么问题? -
为什么需要为自动处理的东西分配内存?
-
您是否要为 MYARRAY 中的每个向量元素“分配内存”?
-
@Josh var.rserve(n) 将为 var[0]...var[n] 分配内存,但不会为每个元素分配内存,例如 var[0] 本身,它没有分配内存.
-
@feelfree 您在帖子中的错误是因为您将
reserve与resize混淆了。reserve不 让您访问您分配的空间。您仍然需要致电push_back、insert、resize等来填写给您的空间。reserve所做的就是让push_backresize和insert等操作不需要自己分配内存。
标签: c++ memory-management vector