push_back到vector c ++时的分段错误

时间:2017-01-18 06:00:38

标签: 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;
}

3 个答案:

答案 0 :(得分:7)

当您push_back项目进入vector时,该项目会被复制。有时,这会在调整vector大小时触发更多工作:复制其当前内容,并且销毁以前属于vector的现在复制的元素。破坏会调用析构函数。

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

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

它尝试delete[]未由new[]分配的数据,无论管理程序的内存是什么,因为预期的记录结构跟踪动态分配对于要返回的存储,存储(分配有newnew[]的内存)未找到或不正确。

此外,face_memory是一个std::vector,一个旨在为您照顾其记忆的对象。在大多数情况下,您无需任何干预即可创建,复制,调整大小和删除vector。最值得注意的反例是vector指针,在从vector移除指针时,您可能必须释放指向的数据。

解决方案是在FacialMemory类析构函数中不执行任何操作。实际上,Rule of Zero建议您根本没有析构函数,因为FacialMemory没有需要特殊处理的成员或资源。编译器将为您生成析构函数,几乎没有错误的可能性。

在阅读“零规则”的链接时,请注意“三和五规则”,因为它们处理类需要特殊处理的情况,并概述了您应该提供的最小处理。

答案 1 :(得分:0)

发生分段错误的原因之一是当您访问无效的内存部分时,在您的程序中,您要释放内存(析构函数中的删除关键字),而不是由<分配strong>新关键字。

答案 2 :(得分:-3)

请参阅vector-push-back

尝试将有意义的复制构造函数添加到FacialMemory