C ++:清除对象向量的问题

时间:2014-11-18 09:31:27

标签: c++ vector clear

编辑:在我的结构上使用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));

我填充了人们的#39;使用Subject类&#39;设定方法。这一切都很好。我想要做的就是重置&#39; people&#39;,即清除所有数据并将大小设置为0.我调用以下方法:

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

clear()行抛出调试断言失败错误消息,该消息表明&#34;表达式:向量迭代器不兼容&#34;。

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

Subject::~Subject(void)
{
}

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

我有点迷失为什么会发生这种情况。任何人都可以提供一些见解吗?

如果我省略了任何必要的代码,我会道歉,可以根据要求更新!

2 个答案:

答案 0 :(得分:3)

您的std::memset来电是(a)多余的,如

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

value-初始化对象,在此处将整数初始化为0并指向nullptr

和(b)实际上非常错误:

  

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

Source

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

答案 1 :(得分:1)

注意:很少OP没有表明他正在使用memset,在他的代码中,#syi给出了这个答案,因为我认为这种行为是因为某些问题在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 ++ link