【发布时间】:2020-04-05 19:29:21
【问题描述】:
我将对象类tipo 推送到一个向量,当我推送第一个构造函数时,构造函数被调用(应该如此)并且析构函数被立即调用(我认为这不应该发生)。然后当我推送下一个对象时,构造函数被调用一次,析构函数被调用两次,然后第三次被调用三次,依此类推。
似乎每次我将某些东西推送到向量时,都会调用更多次析构函数。
这是我的课:
class Item
{
protected:
...
public:
Item();
Item(char * no, int hit, int ve, char * pathTilesheet, int an, int al, bool inv, bool vol, bool fan, int mh = NULL);
~Item();
};
Item::Item(char *no, int hi, int ve, char *pathTilesheet, int an, int al, bool inv, bool vol, bool fan, int mh){
// CARGAR SDL
tileSheet = load_image(pathTilesheet);
tileSheetEspejo = flip_surface(tileSheet, FLIP_HORIZONTAL);
}
这是正在发生的事情:
std::vector<Item> vecItems;
vecItems.push_back(Item("life",4,0,"assets/imagenes/hp.png", 8, 8, false, false, false));
// HERE THE CONSTRUCTOR AND THE DESTRUCTOR ARE CALLED
vecItems.push_back(Item("lifeXL",8,0,"assets/imagenes/hp-xl.png", 16, 16, false, false, false));
// HERE THE CONSTRUCTOR IS CALLED ONCE AND THE DESTRUCTOR TWICE
vecItems.push_back(Item("blast 1",-4,14,"assets/imagenes/bola.png", 8, 8, false, true, false));
// HERE THE CONSTRUCTOR IS CALLED ONCE AND THE DESTRUCTOR MULTIPLE TIMES
我做错了吗?为什么会发生这种情况?
【问题讨论】:
-
这可能是因为副本和重新分配。 Vector 使用连续存储,因此如果超出其容量,它必须分配更大的内存块,复制所有现有元素,然后释放之前的内存。
-
您可能对这个问题感兴趣stackoverflow.com/q/13395984/1741542
-
要查看@user2802841 是否正确,您可以尝试插入 vecItems.reserve(3);在你的陈述之前。
-
计数复制构造函数调用看余额是否正确...
-
如果你写析构函数,你可能需要担心复制和赋值。谷歌“三个 c++ 规则”。