矢量push_back的一个对象导致一个巨大的矢量

时间:2017-01-18 15:57:52

标签: c++ object stdvector push-back

我正在用c ++开发一个项目,我有一个对象向量,我想在现有向量上推送一个对象。但是,在添加对象之前和之后检查大小时,大小从0到12297829382473034412,这让我非常困惑。有问题的代码是下面的addCommodity函数。 (我已经创建了一个相同问题的较小示例,所以请跳到“小问题”)

void Instance::addCommodity(std::vector<std::string> & tokens) {
  /*if(tokens.size()!=5){
    std::cerr << "Error in commodity data format"<< std::endl;
    exit(-1);
  }*/
  // size_t so = std::atoi(tokens[1].c_str());
  // size_t si = std::atoi(tokens[2].c_str());
  // size_t demand = std::atoi(tokens[3].c_str());
  // size_t ti = std::atoi(tokens[4].c_str());
  std::cout << "size: " << this->_commodities->size() << "\n"; 

  this->_commodities->push_back(Commodity(1,2,3,4));  // ???

  std::cout << "size: " << this->_commodities->size() << "\n";
}

这里我已经注释掉了用于从文件中加载的字符串中读取数据的代码部分。商品定义如下:

#include "commodity.h"

Commodity::Commodity(size_t so, size_t si, size_t d, size_t ti):
  _source(so),
  _sink(si),
  _demand(d),
  _maxTime(ti)
{}

Commodity::~Commodity(){}

size_t Commodity::getSource() const{
  return _source;
}

size_t Commodity::getSink() const {
  return _sink;
}

size_t Commodity::getDemand() const {
  return _demand;
}

size_t Commodity::getTime() const {
  return _maxTime;
}

将Instance初始化为:

Instance::Instance(std::shared_ptr<Param> p, size_t n):
  _params(p),
  _nNodes(n)
{
  this->_commodities.reset(new std::vector<Commodity>());
  this->_arcs.reset(new std::vector<Arc>());
  }

如前所述,我的问题在于addCommodity代码,在尝试push_back商品时。希望这是足够的代码来识别我所犯的任何愚蠢错误。我省略了该项目的大部分其他代码,因为它似乎对addCommodity函数没有影响。

调用函数时收到的输出是:

size: 0
size: 12297829382473034412

小问题

我没有显示所有代码,而是在main中的向量上运行了push_back:

#include <iostream>
#include <memory>
#include <sys/time.h>
#include <vector>


#include "commodity.h"

int main(int argc, char* argv[]){


 std::shared_ptr< std::vector<Commodity>> commodities;

  commodities.reset(new std::vector<Commodity>());

  std::cout << "size: " << commodities->size() << "\n";

  size_t a = 1;
  size_t b = 2;
  size_t c = 3;
  size_t d = 4;

  commodities->emplace_back(Commodity(a,b,c,d));

  std::cout << "size: " << commodities->size() << std::endl;

  return 0;

}

这基本上是相同代码的较小实例。商品cpp和h文件如下:

#include "commodity.h"

Commodity::Commodity(size_t so, size_t si, size_t d, size_t ti):
  _source(so),
  _sink(si),
  _demand(d),
  _maxTime(ti)
{}

Commodity::~Commodity(){}

size_t Commodity::getSource() const{
  return _source;
}

size_t Commodity::getSink() const {
  return _sink;
}

size_t Commodity::getDemand() const {
  return _demand;
}

size_t Commodity::getTime() const {
  return _maxTime;
}

标题文件:

#ifndef CG_MCF_COMMODITY_H
#define CG_MCF_COMMODITY_H

#include <stdlib.h>

class Commodity {

 public:

  Commodity(size_t so, size_t si, size_t d, size_t t);

  ~Commodity();

  size_t getSource() const;

  size_t getSink() const;

  size_t getDemand() const;

  size_t getTime() const;

 private:

  size_t _source;

  size_t _sink;

  size_t _demand;

  size_t _maxTime;

};

#endif /*CG_MCF_COMMODITY_H*/

调用函数时收到的输出是:

size: 0
size: 12297829382473034412

1 个答案:

答案 0 :(得分:1)

您的Commodity课程违反了rule of 0/3/5

你的代码(莫名其妙地)这样做:

commodities->emplace_back(Commodity(a,b,c,d));

这真的很奇怪。据推测,您正在调用emplace_back以避免必须与向量中的Commodity构建单独的Commodity。但是,强制通过明确构建单独的emplace_back作为Commodity的参数来实现

调用Commodity的复制构造函数来构造向量中的Commodity,作为您明确创建的副本。除Commmodity之外没有{。}}。最有可能的是,真正的onCreate()类需要一个,因为它有一个析构函数。