当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《push_back到vectorc++时的分段错误》经验,为你挑选了1个好方法。

我试图使用该push_back方法将空白对象附加到列表中.

main.cpp中

    vector 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 face_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没有需要特殊处理的成员或资源.编译器将为您生成析构函数,几乎没有错误的机会.

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



1> user4581301..:

当您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没有需要特殊处理的成员或资源.编译器将为您生成析构函数,几乎没有错误的机会.

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

推荐阅读
大大炮
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有