在 c++ 中维护多个 class 实例(对象)而不调用析构函数

Maintaining multiple class instances (objects) wihout destructor calls in c++

我想创建许多“Student”类型的对象并存储它们以便在整个程序中使用它们。我还需要在创建和销毁学生时打印出消息,但是当我将“销毁”消息放入析构函数时,只要我更改实例以创建下一个学生,它就会出现,因为析构函数被调用。有没有办法绕过它,只在程序结束时为每个对象调用析构函数?

当前这段代码会在创建下一个学生时销毁每个学生(使用每个 for 循环),然后在程序结束时再次“重新销毁”。我只希望最后删除它们。

#include <iostream>
#include <string>

class Student{  
    // members
public:

    Student(){}
    Student(std::string name, int floor, int classroom ){
        std::cout<<"Student created\n\n";
        // assignments
    }
    ~Student(){std::cout<<"Student destroyed\n\n";}
       // methods
};

int main(int argc, char** argv) {

Student* S=new Student[5];

for (int i=0; i<5; i++){
    S[i]=Student("example", 1,1); //makes 5 students and stores them
}

// rest of the program

delete[] S;

return 0;
}

您从循环中看到的析构函数不是被析构的数组元素,而是您通过Student("example", 1,1).

创建的临时对象

声明

S[i]=Student("example", 1,1);

本质上等于

Student temporary_object("example", 1, 1);
S[i] = temporary_object;

如果你想创建五个对象,其中每个对象都被完全相同地初始化(这就是你正在做的)然后使用带有显式初始化器的std::vector

std::vector<Student> S(5, Student("example", 1,1));

对于您在 std::vector 构造函数调用中创建的临时对象,这仍将调用一次析构函数。


一种跳过临时对象创建的方法,但这也需要使用向量:

std::vector<Student> S;
S.reserve(5);  // Reserve memory enough for five elements

for (unsigned i = 0; i < 5; ++i)
{
    S.emplace_back("example", 1, 1);  // Construct in-place in the vector,
                                      // no temporary object creted
}

请注意,reserve 调用对于避免向量的重新分配很重要,这涉及可能的数据复制和旧数据的销毁