向量的对象所有相同的对象后,添加单独的对象到它

vector of object all the same object after adding separate objects to it

本文关键字:对象 添加 单独 向量      更新时间:2023-10-16

所以我在类中的向量中添加了一堆对象。我可以添加所有的东西,或者看起来很好,但是当我要打印向量的内容时所有的东西都是我添加的最后一个对象。为什么呢?这就是添加

后的效果

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;

This is 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);
}

这是字母h

class Letter: public Package{`enter code here`
public:
  Letter();
  double cost();
};

Made it with Letter。我用哪个对象都没关系。它们都是一样的

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

  1. package改为vector<Letter>而不是vector<Letter*>。现在,您只需高兴地push_back(或者,最好是emplace_back) Letter s。
  2. 如果你必须使用指针,使用unique_ptr(或其他智能指针)。所以package就是vector<unique_ptr>。当vector被销毁时,unique_ptr将负责内存释放。

如果你不想使用智能指针,你将不得不自己管理delete。因此,如果packageMyAwesomePackage的成员(没有双关语的意思),您将在析构函数中执行此操作:

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

虽然您没有显示vector的声明,但您在此语句中的用法:

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

表明你不是在构建一个对象的向量,而是一个指向对象的指针的向量。

如果vector仅包含一个指针,并且在将指针压入vector后修改了该指针所引用的对象,则稍后通过vector中的指针访问该指针时将看到新值。

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

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

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

要做到这一点,您需要在vector中存储实际对象:

std::vector<Package> packages;

或者在每次将指针压入vector之前分配一个新的Package对象。

看完完整的代码后,你的问题稍微有点不同:你在将指向对象的指针压入vector后删除了对象。因此,vector包含指向已删除对象的指针,这会导致未定义的行为。在您的测试用例中可能发生的是,当您在删除前一个对象后分配新对象时,您将再次获得指向相同内存的指针。这就是为什么看起来所有的值都是一样的。但即便如此,这也是"随机的"和完全未指定的行为。