对象的向量在向其添加单独的对象之后所有相同的对象

时间:2014-08-02 05:23:45

标签: c++ vector

所以我将一堆对象添加到我班级的向量中。我能够添加所有内容,或者看起来很好,但是当我去打印矢量的内容时,一切都是我添加的最后一个对象。这是为什么?这是我添加

时的样子

this->packages.push_back(mc);

当我调用我想要打印的对象时,这就是它的样子

std::cout << truck.packages[1]->getTrack() << endl;

我不确定我做错了什么,在添加和删除项目时,向量似乎非常简单。

如果我需要添加其他内容,请告诉我。

  std::cout << truck.packages[1]->getTrack() << endl;
  std::cout << truck.packages[2]->getTrack() << endl;

Output: 11111 11111

这就是我创建对象的方式

if(type == 0){
  Letter *letter = new Letter();
  letter->setType("Letter");
  letter->setWeight(weight);
  letter->setTrack(track);
  price = letter->cost();
  letter->setPrice(price);

  this->packages.push_back(letter);

  truckWeight = this->getGross() + (weight / 16);
  this->setGross(truckWeight);

  this->numPackages++;

  delete letter;

这是letter.cpp

Letter::Letter()
{
  this->type = "Letter";
  this->price = 0.0;
  this->weight = 0;
  this->trackingNumber = 0;
}

double Letter::cost()
{
  int weight = this->getWeight();
  if(weight > 32)
    return 0.0;
  else
    return (0.5 * weight);
}

这是letter.h

class Letter: public Package{`enter code here`

public:
  Letter();

  double cost();
};

用Letter写的。我使用哪个对象并不重要。他们都做同样的事情

2 个答案:

答案 0 :(得分:2)

您的代码中有UB。您有vectorLetter*个。当你push_back这些Letter*时,向量只会复制这些指针。在原始delete上调用Letter*后,这些向量元素现在悬空。您可以通过两种方式处理此问题:

  1. package设为vector<Letter>而不是vector<Letter*>。现在,您很高兴push_back(或者,首选emplace_backLetter s。
  2. 如果必须使用指针,请使用unique_ptr(或其他一些智能指针)。因此,package将是vector<unique_ptr>。当向量被破坏时,unique_ptr将负责内存释放。
  3. 如果您不想使用智能指针,则必须自己管理delete。因此,如果packageMyAwesomePackage的成员(没有双关语),您可以在析构函数中执行此操作:

    MyAwesomePackage::~MyAwesomePackage()
    {
    ///Other destruction
    for(auto * letter : package)
      delete letter;
    }
    

答案 1 :(得分:0)

虽然您没有显示向量的声明,但您在此声明中的用法是:

std::cout << truck.packages[1]->getTrack() << endl;

表明你没有构建一个对象矢量,而是一个指向对象的矢量。

如果向量只包含一个指针,并且在将指针推入向量后修改此指针引用的对象,则稍后通过向量中的指针访问它时将看到新值。

你可能正在做这样的事情:

std::vector<Package*> packages;
mc = new Package;
mc->setFoo(1);
packages.push_back(mc);
mc->setFoo(2);
packages.push_back(mc);

现在,您有两个指向矢量中同一对象的指针。由于您在第一次push_back()调用后修改了对象,因此当您访问向量中的任一元素时,您将看到对象的新值。

要使其工作,您需要将实际对象存储在向量中:

std::vector<Package> packages;

或每次在将指针推入向量之前分配一个新的Package对象。

看到完整代码后,您的问题略有不同:您在将指针推入向量后删除了对象。因此,向量包含指向已删除对象的指针,这会导致未定义的行为。在您的测试用例中可能发生的情况是,在删除前一个对象后分配新对象时,您将再次获得指向同一内存的指针。这就是看起来所有值都相同的原因。但即使这是“随机”和完全未指明的行为。