我正在尝试使用push_back
方法将空白对象附加到列表中。
的main.cpp
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;
}
答案 0 :(得分:7)
当您push_back
项目进入vector
时,该项目会被复制。有时,这会在调整vector
大小时触发更多工作:复制其当前内容,并且销毁以前属于vector
的现在复制的元素。破坏会调用析构函数。
不幸的是,FacialMemory
的析构函数包含致命错误:
FacialMemory::~FacialMemory()
{
delete[] & face_memory; <<== right here
}
它尝试delete[]
未由new[]
分配的数据,无论管理程序的内存是什么,因为预期的记录结构跟踪动态分配对于要返回的存储,存储(分配有new
或new[]
的内存)未找到或不正确。
此外,face_memory
是一个std::vector
,一个旨在为您照顾其记忆的对象。在大多数情况下,您无需任何干预即可创建,复制,调整大小和删除vector
。最值得注意的反例是vector
指针,在从vector
移除指针时,您可能必须释放指向的数据。
解决方案是在FacialMemory
类析构函数中不执行任何操作。实际上,Rule of Zero建议您根本没有析构函数,因为FacialMemory
没有需要特殊处理的成员或资源。编译器将为您生成析构函数,几乎没有错误的可能性。
在阅读“零规则”的链接时,请注意“三和五规则”,因为它们处理类需要特殊处理的情况,并概述了您应该提供的最小处理。
答案 1 :(得分:0)
发生分段错误的原因之一是当您访问无效的内存部分时,在您的程序中,您要释放内存(析构函数中的删除关键字),而不是由<分配strong>新关键字。
答案 2 :(得分:-3)
尝试将有意义的复制构造函数添加到FacialMemory
类