班级代码:
class demo_
{
protected:
sf::CircleShape* demo_point;
public:
demo_()
{
std::cout << "init\n";
demo_point = new sf::CircleShape();
}
~demo_()
{
std::cout << "delete\n";
delete demo_point;
}
};
主要代码:
std::vector <demo_> obj;
std::cout << "1\n";
for (int i = 0; i < 100; i++) {
std::cout << "3\n";
demo_ tpoint = demo_();
//tpoint.SetColor(GetRandomColor());
//tpoint.SetRadius(5.f);
//tpoint.SetStartPosition((float)(rand() % sizeWindowX), (float)(rand() % sizeWindowY));
obj.push_back(tpoint);
}
std::cout << "2\n";
工作成果:
1
3
init
delete
3
init
delete
delete
例外:在地址读取时访问冲突
为什么循环中的第二个 demo_ 调用了两次析构函数?
简短的回答是违反了这里的三/五规则
由于您有一个重要的构造函数和析构函数(并且以一种简单的方式 - 类中有一个裸指针),因此您需要添加一个复制构造函数和一个赋值运算符,并正确转发/复制指针。一切都会奏效。
为什么会出现问题?当内部的向量扩展时,它会分配一个新位置并将其元素复制到那里。并且没有复制构造函数 - 所以他自己生成了它,他只是复制指针本身。当一个析构函数释放时,另一个析构函数就会遇到麻烦。
由于您没有考虑一个构造函数,因此您不清楚为什么要再次调用析构函数。