C++:清除对象向量时出现问题

C++: Issue with clearing a vector of objects

本文关键字:问题 向量 清除 对象 C++      更新时间:2023-10-16

>编辑:这似乎是在我的结构上使用memset而不是清除向量的问题。感谢所有提供建议的人!


我正在尝试清除名为 people 的 Subject 对象(我自己定义的类)的向量。向量位于结构 (pQA) 中,定义如下:

typedef struct _FSTRUCT_
{
    const char * filePath;
    std::vector<Subject> people;
    long srcImageWidth;
    long srcImageHeight;
    STRUCT_CONFIG_PARAMS * configParam;
    unsigned char * imageBuf;
    int imageBufLen;
} STRUCT_FSTRUCT;

我通过以下方式创建 pQA 结构:

STRUCT_FSTRUCT *pQA = NULL;
pQA = new STRUCT_FSTRUCT();
memset(pQA,0,sizeof(STRUCT_FSTRUCT));

我通过使用 Subject 类的 set 方法用数据填充"人"。这都很好。我想做的是重置"人",即清除所有数据并将大小设置为 0。我调用以下方法:

int ResetFaceCollection()
{
    if (!pQA->people.empty())
    {
        pQA->people.clear();
    }
}

clear()行抛出调试断言失败错误消息,指出"表达式:矢量迭代器不兼容"。

我不确定这是否与主题的析构函数有关:

Subject::~Subject(void)
{
}

我没有使用任何指针,所以从我收集的内容来看,析构函数看起来不错。当然,我已经在我的 .h 文件中定义了析构函数也~Subject(void);.

我有点迷茫为什么会发生这种情况。谁能提供一些见解?

如果我遗漏了任何必要的代码,我深表歉意,可以根据要求更新!

您的std::memset调用是(a)多余的,因为

pQA = new STRUCT_SPID_QA(); // <---- note the parens

value-初始化对象,该对象初始化整数以0并指针以在此处nullptr

(b)实际上非常错误:

如果对象不是普通可复制的(例如,标量、数组或 C 兼容结构),则行为是未定义的。

您的_SPID_FQA_包含类型 std::vector<Subject> 的非平凡可复制对象,这使得_SPID_FQA_不可平凡可复制的对象。

注意

首先,OP 并没有表明他在他的代码中使用了 memset,这是我给出了这个答案,因为我认为这种奇怪的行为是因为clear中的一些问题,如下面的链接所述。

1) cppreference.com:表示它使引用所包含元素的任何引用、指针或迭代器无效。可能会使任何结束迭代器无效。保持矢量的capacity()不变。

2)cplusplus.com 说:不能保证会发生重新分配,并且不能保证向量容量会因为调用这个函数而改变。强制重新分配的典型替代方法是使用 swap

vector<T>().swap(x); // clear x reallocating

但您也可以使用它:

int ResetFaceCollection()
{
    if (!pQA->people.empty())
    {
        pQA->people.erase(pQA->people.begin(),pQA->people.end());
    }
}

并检查它是否给出任何错误?

这是可能相同的环境,并且可以在G ++,CLANG,VC++链接下正常工作