0ct*_*gon 0 c++ destructor class vector c++11
在这段代码中:
Texture * a = new Texture();
Texture * b = new Texture();
buttons.push_back(*a);
buttons.push_back(*b);
Run Code Online (Sandbox Code Playgroud)
buttons
是一个像这样定义的向量:
std::vector<Texture> buttons;
Run Code Online (Sandbox Code Playgroud)
纹理是一个类,这是它的原型:
class Texture
{
public:
Picture * texData;
HitBox * texCoords;
Texture();
~Texture();
void render_tex();
};
Run Code Online (Sandbox Code Playgroud)
第一个代码块的第4行是调用纹理a的析构函数.问题是这个析构函数删除了指向的值texData
,texCoords
这意味着当它被重新分配texData
并texCoords
指向垃圾数据时.
有没有办法使它在重新分配时向量不会调用析构函数?
由于您正在动态分配数据成员texData
,因此texCoords
您需要遵循规则三,并定义复制构造函数和复制赋值运算符,否则您的代码将很容易被破坏,如您所发现的那样.
但是有更好的方法!不要使用原始指针作为数据成员.用unique_ptr
s来抓住它们.(你可能根本不需要它们作为指针,但我会在这里给你带来疑问).unique_ptr
如果希望类可以复制,您仍然需要定义复制构造函数和复制赋值运算符,并手动复制s所持有的内容.
为了使其可移动,您可以显式=default
移动构造函数和移动赋值运算符.
此外,您的代码正在泄漏内存.您动态分配这些对象,然后push_back
将副本分配到vector
Texture * a = new Texture();
buttons.push_back(*a);
Run Code Online (Sandbox Code Playgroud)
您正在解除引用a
并将其副本添加到vector
.除非你delete a;
在它超出范围之前,否则你会发生内存泄漏.请vector<unique_ptr<Texture>>
改用.
vector<unique_ptr<Texture>> buttons;
buttons.push_back(unique_ptr<Texture>(new Texture()));
Run Code Online (Sandbox Code Playgroud)
使用C++ 14,您可以使用它make_unique
来避免new
自己拥有对象
buttons.push_back(make_unique<Texture>());
Run Code Online (Sandbox Code Playgroud)
此外,如果您知道要提前添加的按钮数量,则可以留出reserve
空间以避免重新分配.
buttons.reserve(num_buttons);
Run Code Online (Sandbox Code Playgroud)
现在,您可能根本不需要动态分配Texture
对象.你可能需要的只是
vector<Texture> buttons;
buttons.push_back(Texture());
Run Code Online (Sandbox Code Playgroud)
如果可能的话,我还会定义一个移动构造函数和移动赋值运算符,Texture
以便在向量重新分配时移动它,而不是复制它.