我们可以控制向量数组(c++)中元素的内存分配吗?

Posted

技术标签:

【中文标题】我们可以控制向量数组(c++)中元素的内存分配吗?【英文标题】:can we control memory allocation for elements in the vector array (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 个课程,我不能绝对确定您指的是哪一个,或者每次都相同。明确说明哪个类存在于哪个二进制文件中,而不是含糊其辞。对你的问题要明确和直接,而不是“这可能是个问题”。 【参考方案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 的问题?一个可执行文件和库静态链接到两个不同的堆:或者至少这是我从帖子的内脏中解码出来的。

以上是关于我们可以控制向量数组(c++)中元素的内存分配吗?的主要内容,如果未能解决你的问题,请参考以下文章

C++中向量的初始容量

C++简单实现vector

给定该类的对象数组,为类成员向量分配内存有问题吗?

我可以直接从 C++ 中向量元素的指针获取索引吗?

C++:如何安全地释放堆分配的向量数组?

c++ stl复制函数正确的内存管理