我试图使用该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
}
Run Code Online (Sandbox Code Playgroud)
在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();
};
Run Code Online (Sandbox Code Playgroud)
构造函数和析构函数
FacialMemory::FacialMemory()
{
}
FacialMemory::~FacialMemory()
{
delete[] & face_memory;
}
Run Code Online (Sandbox Code Playgroud)
当您push_back将项目放入a时vector,将复制该项目.有时这会在vector调整大小时触发更多工作:复制当前内容,并且vector销毁以前复制的元素.破坏调用析构函数.
不幸的是,FacialMemory析构函数包含致命错误:
FacialMemory::~FacialMemory()
{
delete[] & face_memory; <<== right here
}
Run Code Online (Sandbox Code Playgroud)
它会尝试delete[]未分配的数据new[],以及管理程序内存的任何内容都是合适的,因为没有找到跟踪动态分配的存储(分配有new或带有的内存)的预期簿记结构new[]不正确.
此外,face_memory是一个std::vector旨在为您照顾其记忆的对象.vector在大多数情况下,您可以无需任何干预即可创建,复制,调整大小和删除.最值得注意的反例是一个vector指针,你可能必须在从指针中删除指针时释放指向的数据vector.
解决方案是在FacialMemory类析构函数中不执行任何操作.实际上,Zero of Zero建议您根本没有析构函数,因为FacialMemory没有需要特殊处理的成员或资源.编译器将为您生成析构函数,几乎没有错误的机会.
在阅读"零规则"的链接时,请注意"三和五规则",因为它们处理的是一个类需要特殊处理的情况,并概述了您应该提供的最小处理.
| 归档时间: |
|
| 查看次数: |
9748 次 |
| 最近记录: |