【发布时间】:2020-10-03 06:04:55
【问题描述】:
我正在尝试将结构存储在向量中。 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
是的,似乎析构函数被调用了两次!一次是添加到向量中,第二次是程序完成执行。
当我尝试使用类而不是结构时,会发生完全相同的事情。
谁能解释为什么会发生这种情况以及正确完成我的任务的可能方法是什么?
【问题讨论】:
-
您需要使用
char*吗?std::string是字符串数据和 Just Works™ 管理其内存的正常选择。 -
您需要提供一个复制构造函数,该构造函数实际上复制了
chairs成员指向的数据;否则,push_back调用(调用默认副本)只会制作指针的副本。然后,当任何此类副本被销毁时,指针将失效。见en.wikipedia.org/wiki/…。 -
@chris 我使用
char*因为我需要存储原始字节 -
std::vector<char>会更好。如果不需要使用char*,还有更好的方法。 -
@drescherjm 我认为
std::vector<char>没有用,因为无论如何都会调用析构函数,我会删除其中的向量元素
标签: c++ memory-management struct dynamic destructor