C++ 向同一对象添加单独对象后,该对象的矢量将与该对象相同

C++ 向同一对象添加单独对象后,该对象的矢量将与该对象相同,c++,vector,C++,Vector,所以我在我的类中向一个向量添加了一堆对象。我可以添加所有内容,或者说,看起来很好,但是当我打印向量的内容时,所有内容都是我添加的最后一个对象。为什么呢?这就是当我添加 this->packages.push_-back(mc) 这就是我调用要打印的对象时的样子 std::cout getTrack()当您不显示向量声明时,您在该语句中的用法: std::cout << truck.packages[1]->getTrack() << endl; 或者在每次将指针推

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

this->packages.push_-back(mc)

这就是我调用要打印的对象时的样子


std::cout getTrack()当您不显示向量声明时,您在该语句中的用法:

std::cout << truck.packages[1]->getTrack() << endl;
或者在每次将指针推入向量之前分配一个新的
对象


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

您的代码中有UB。你有一个
向量
字母*
s。当你向后推这些
字母*
s时,向量只会复制这些指针。一旦对原始的
字母*
调用
delete
,这些向量元素现在就悬空了。您可以通过两种方式处理此问题:

  • package
    a
    vector
    替换为
    vector
    。现在,您只需愉快地
    向后推
    (或者,更可取的是,
    向后安置
    字母
    s
  • 如果必须使用指针,请使用
    unique\ptr
    (或其他智能指针)。所以,
    将是
    向量
    。当向量被销毁时,
    unique_ptr
    s将负责内存释放
  • 如果您不想使用智能指针,则必须自己管理
    delete
    s。因此,如果
    package
    MyAwesomePackage
    的成员(没有双关语),您可以在析构函数中执行此操作:

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

    std::cout getTrack()不,我使用的是一个for循环1,大小与它相同。仍然会得到同样的东西张贴您的代码,以便mccare详细说明
    mc
    来自何处?在推回之前,是否为每个项目分配新对象?请,请发布重现问题的代码。你有那个密码;我们没有。我的水晶球告诉我,如果你调试了它,你会看到向量中的所有指针都是同一个对象指针。嗯<代码>删除字母?你不是刚把它加到容器里了吗?你能再澄清一件事吗?展示
    卡车
    成员
    包裹的真实声明。我感觉你在使用指针来促进
    cost()
    的虚拟派生和多态重写,看到这个声明将巩固这一理论。如果我使用指针,如果我在使用unique时出错,我将如何在使用后删除它们_ptr@kevorski你必须自己处理。由于
    package
    是类成员,您可以通过类析构函数正确地解除这些指针的分配。因此,当我处理完向量时,我只需遍历向量并调用delete,然后在析构函数中将其设为null?
    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);
    }
    
    class Letter: public Package{`enter code here`
    
    public:
      Letter();
    
      double cost();
    };
    
    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);
    
    std::vector<Package> packages;
    
    MyAwesomePackage::~MyAwesomePackage()
    {
    ///Other destruction
    for(auto * letter : package)
      delete letter;
    }