繁体   English   中英

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

[英]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[]分配的数据,并且管理程序内存的任何东西都是合适的,因为预期的簿记结构跟踪动态分配的存储(分配有newnew[]内存)对于返回的存储未找到或不正确。

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

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

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

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

请参考矢量推回

尝试向FacialMemory类添加有意义的复制构造函数

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM