[英]Segmentation fault when push_back to vector c++
我试图使用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;
}
将项目推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
类析构函数中不执行任何操作。 事实上, Zero of Zero建议您根本没有析构函数,因为FacialMemory
没有需要特殊处理的成员或资源。 编译器将为您生成析构函数,几乎没有错误的机会。
在阅读“零规则”的链接时,请注意“三和五规则”,因为它们处理的是一个类需要特殊处理的情况,并概述了您应该提供的最小处理。
发生分段错误的原因之一是当您访问无效的内存部分时,在您的程序中,您要释放未由new关键字分配的内存(在析构函数中删除关键字)。
请参考矢量推回
尝试向FacialMemory
类添加有意义的复制构造函数
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.