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
avector
替换为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;
}