【问题标题】:can we control memory allocation for elements in the vector array (c++)?我们可以控制向量数组(c++)中元素的内存分配吗?
【发布时间】:2016-07-08 15:33:12
【问题描述】:

我将给出以下代码来说明我的问题:

class Abc
{
 public:
  Abc(std::string &a, std::string &b, int num)
  {
       pairArray_ = std::make_pair(a,b);
       num_ = num;
   }
  std::pair<std::string, std::string> pairArray_;
  int num_;
};

class Bcd
{
  public:
     Bcd()
     {
            myArray_.reserve(100);
        }
      void push_back(std::string &a, std::string &b, int num)
      {
            Abc temp(a,b,num);
            myArray.push_back(temp);
       }

  public:
      std::vector<Abc> myArray_;


}

这两个类的典型用法如下:

void main()
{
  Bcd tempExp;
  std::string a;
  std::string b;
int num;
  tempExp.push_back(a,b,num);

}

从代码中我们可以看到,每次从Bcd类调用push_back函数时,都会从Abc类分配内存,然后将其复制到向量myArray_中。该向量将处理每个复制的Abc 对象的内存分配。如果我们将类定义放在库中,而在使用静态运行时库时将执行代码放在程序中,这可能会出现问题。我想知道如何避免从向量数组分配内存。我尝试通过在类定义中使用reserve 来避免为向量分配内存。但是,这个reserve 函数只能处理整个向量的内存分配,而不能处理其元素的内存分配。

【问题讨论】:

  • 请避免“上课”。您的帖子中有 4 个课程,我不能绝对确定您指的是哪一个,或者每次都相同。明确说明哪个类存在于哪个二进制文件中,而不是含糊其辞。对你的问题要明确和直接,而不是“这可能是个问题”。

标签: c++ memory memory-management vector


【解决方案1】:

使用emplace_back:

 void emplace_back(std::string &a, std::string &b, int num)
 {
        // no temporary created
        myArray.emplace_back(a, b, num);
 }

将一个新元素附加到容器的末尾。元素是 通过std::allocator_traits::construct 构造,通常 使用 placement-new 在该位置构造元素 in-place 由容器提供。参数args... 被转发到 构造函数为std::forward&lt;Args&gt;(args)....

【讨论】:

  • 为什么你认为这解决了“分配在错误的std库实例中”的问题?请明确。
  • @Yakk “分配在错误的 std 库实例中”...那是什么?
  • OP 的问题?一个可执行文件和库静态链接到两个不同的堆:或者至少这是我从帖子的内脏中解码出来的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多