2017-01-18 43 views
2

我想使用push_back方法将空白对象追加到列表中。push_back向量C++时出现分段错误

的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

你的FacialMemory类的构造函数是什么?而且你的代码效率低下,因为你在任何地方复制对象。考虑使用移动语义或堆分配对象。 – Dai

+0

在发布的代码中没有致命错误,但在未发布的代码中存在大量错误空间。请[mcve]。 – user4581301

+0

好吧,我已经为FacialMemory添加了构造函数和析构函数 – DSchana

回答

5

当你push_back项目为vector,该项目将被复制。有时这会触发更多的工作,因为vector被调整大小:它的当前内容被复制,并且过去属于vector的现在复制的元素被销毁。破坏会调用析构函数。

不幸的是,FacialMemory的析构函数中包含一个致命的错误:

FacialMemory::~FacialMemory() 
{ 
     delete[] & face_memory; <<== right here 
} 

它试图不是由new[]分配delete[]数据,不管是管理程序的内存一阵痉挛,因为预期簿记找不到或不正确的结构来跟踪动态分配的存储(分配有newnew[]的存储器)用于返回存储的结构。

此外,face_memory是一个std::vector,一个旨在为您照顾它的记忆的对象。在大多数情况下,您可以创建,复制,调整大小和删除vector,而无需任何干预。最值得关注的计数器案例是指针的vector,您可能需要在从vector中删除指针时释放指向的数据。

的解决方案是什么都不做的FacialMemory类的析构函数。实际上,Rule of Zero建议您根本没有析构函数,因为FacialMemory没有需要特殊处理的成员或资源。编译器将为您生成析构函数,但几乎没有发生错误的机会。

在阅读链接零的规则,注意三个规则和五,因为他们处理情况,即类确实需要特殊处理,并勾勒出最小处理,你应该提供的案件。

-1

发生分段错误的原因之一是,当你访问一个无效的内存部分,并在你的程序中释放内存(删除关键字在你的析构函数中),这是不是由关键字分配的内存。