我试着在向量中存储结构。 Struct需要为给定大小的char*动态分配内存。 但是只要我把结构添加到一个向量中,它的析构函数就会被调用,就好像我丢失了指向它的指针一样。
为了举例,我做了这个小演示。
#include "stdafx.h"
#include <iostream>
#include <vector>
struct Classroom
{
char* chairs;
Classroom() {} // default constructor
Classroom(size_t size)
{
std::cout << "Creating " << size << " chairs in a classroom" << std::endl;
chairs = new char[size];
}
~Classroom()
{
std::cout << "Destroyng chairs in a classroom" << std::endl;
delete[] chairs;
}
};
std::vector<Classroom> m_classrooms;
int main()
{
m_classrooms.push_back(Classroom(29));
//m_classrooms.push_back(Classroom(30));
//m_classrooms.push_back(Classroom(30));
system("Pause");
return 0;
}
输出为
Creating 29 chairs in a classroom
Destroyng chairs in a classroom
Press any key to continue . . .
Destroyng chairs in a classroom
是的,好像析构函数被调用了两次! 一次是在向量添加时,第二次是在程序执行完毕时。
当我尝试使用类而不是结构时,也会发生完全相同的事情。
有人能解释一下为什么会出现这种情况吗?有哪些可能的方法可以正确地完成我的任务?
@lpvoid
使用emplace_back(。。) 在适当的位置创建对象可以帮助您避免在这里面临的双重释放或损坏
错误。
m_classrooms.emplace_back(29)
然而,始终遵循3/5/0的规则以不以悬空指针结束是一种更好的实践。