push_back 到向量 c 时的分段错误

新手上路,请多包涵

我正在尝试使用 push_back 方法将空白对象附加到列表中。

主文件

    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;
}

原文由 DSchana 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 712
2 个回答

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

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

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

它尝试 delete[] 未由 new[] 分配的数据,并且管理程序内存的任何东西都适合,因为预期的簿记结构跟踪动态分配的存储(内存分配有 newnew[] )用于返回的存储未找到或不正确。

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

解决方案是在 FacialMemory 类析构函数中什么都不做。事实上, 零规则 建议您根本不要使用析构函数,因为 FacialMemory 没有需要特殊处理的成员或资源。编译器将为您生成析构函数,出错的可能性几乎为零。

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

原文由 user4581301 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

原文由 sitaram chhimpa 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏