我正在尝试使用 push_back
方法将空白对象附加到列表中。
主文件
vector<FacialMemory> facial_memory;
printf("2\n");
// Add people face memories based on number of sections
for (int i = 0; i < QuadrantDict::getMaxFaceAreas(); i++)
{
printf("i %d\n", i);
FacialMemory n_fm;
facial_memory.push_back(n_fm); // NOTE: Breaks here
}
在 push_back
方法调用中,程序因分段错误而崩溃。我环顾了类似的问题,他们指出了我在这里的解决方案。我也尝试将 FacialMemory()
传递到 push_back 调用中,但仍然是同样的问题。
FacialMemory 类是这样定义的:FacialMemory.h
class FacialMemory
{
private:
vector<FaceData> face_memory;
public:
FacialMemory();
~FacialMemory();
void pushData(FaceData face);
bool isEmpty();
vector<FaceData> getFaces();
FaceData getRecent();
};
构造函数和析构函数
FacialMemory::FacialMemory()
{
}
FacialMemory::~FacialMemory()
{
delete[] & face_memory;
}
原文由 DSchana 发布,翻译遵循 CC BY-SA 4.0 许可协议
当您
push_back
一个项目进入vector
时,该项目被复制。有时这会触发更多的工作,因为vector
被调整大小:它的当前内容被复制,并且曾经属于vector
的现在复制的元素被破坏。 destroy 调用析构函数。不幸的是,
FacialMemory
的析构函数包含一个致命错误:它尝试
delete[]
未由new[]
分配的数据,并且管理程序内存的任何东西都适合,因为预期的簿记结构跟踪动态分配的存储(内存分配有new
或new[]
)用于返回的存储未找到或不正确。此外,
face_memory
是一个std::vector
,一个旨在为您管理其内存的对象。在大多数情况下,您无需任何干预即可创建、复制、调整大小和删除vector
。最值得注意的反例是vector
指针,当从vector
中删除指针时,您可能必须释放指向的数据。解决方案是在
FacialMemory
类析构函数中什么都不做。事实上, 零规则 建议您根本不要使用析构函数,因为FacialMemory
没有需要特殊处理的成员或资源。编译器将为您生成析构函数,出错的可能性几乎为零。在阅读零规则的链接时,请注意三规则和五规则,因为它们处理了一个类确实需要特殊处理的情况,并概述了您应该提供的最低限度的处理。