如何在不调用析构函数的情况下重新分配向量?

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这意味着当它被重新分配texDatatexCoords指向垃圾数据时.

有没有办法使它在重新分配时向量不会调用析构函数?

Pra*_*ian 5

由于您正在动态分配数据成员texData,因此texCoords您需要遵循规则三,并定义复制构造函数和复制赋值运算符,否则您的代码将很容易被破坏,如您所发现的那样.

但是有更好的方法!不要使用原始指针作为数据成员.用unique_ptrs来抓住它们.(你可能根本不需要它们作为指针,但我会在这里给你带来疑问).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以便在向量重新分配时移动它,而不是复制它.