我试图使用该push_back
方法将空白对象附加到列表中.
main.cpp中
vectorfacial_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: vectorface_memory; public: FacialMemory(); ~FacialMemory(); void pushData(FaceData face); bool isEmpty(); vector getFaces(); FaceData getRecent(); };
构造函数和析构函数
FacialMemory::FacialMemory() { } FacialMemory::~FacialMemory() { delete[] & face_memory; }
user4581301.. 7
当您push_back
将项目放入a时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
没有需要特殊处理的成员或资源.编译器将为您生成析构函数,几乎没有错误的机会.
在阅读"零规则"的链接时,请注意"三和五规则",因为它们处理的是一个类需要特殊处理的情况,并概述了您应该提供的最小处理.
当您push_back
将项目放入a时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
没有需要特殊处理的成员或资源.编译器将为您生成析构函数,几乎没有错误的机会.
在阅读"零规则"的链接时,请注意"三和五规则",因为它们处理的是一个类需要特殊处理的情况,并概述了您应该提供的最小处理.