所以我将一堆对象添加到我班级的向量中。我能够添加所有内容,或者看起来很好,但是当我去打印矢量的内容时,一切都是我添加的最后一个对象。这是为什么?这是我添加
时的样子 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写的。我使用哪个对象并不重要。他们都做同样的事情
答案 0 :(得分:2)
您的代码中有UB。您有vector
个Letter*
个。当你push_back
这些Letter*
时,向量只会复制这些指针。在原始delete
上调用Letter*
后,这些向量元素现在悬空。您可以通过两种方式处理此问题:
package
设为vector<Letter>
而不是vector<Letter*>
。现在,您很高兴push_back
(或者,首选emplace_back
)Letter
s。unique_ptr
(或其他一些智能指针)。因此,package
将是vector<unique_ptr>
。当向量被破坏时,unique_ptr
将负责内存释放。如果您不想使用智能指针,则必须自己管理delete
。因此,如果package
是MyAwesomePackage
的成员(没有双关语),您可以在析构函数中执行此操作:
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
对象。
看到完整代码后,您的问题略有不同:您在将指针推入向量后删除了对象。因此,向量包含指向已删除对象的指针,这会导致未定义的行为。在您的测试用例中可能发生的情况是,在删除前一个对象后分配新对象时,您将再次获得指向同一内存的指针。这就是看起来所有值都相同的原因。但即使这是“随机”和完全未指明的行为。