在 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
调用对于避免向量的重新分配很重要,这涉及可能的数据复制和旧数据的销毁。
我想创建许多“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
调用对于避免向量的重新分配很重要,这涉及可能的数据复制和旧数据的销毁。