编辑:在我的结构上使用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);
。
我有点迷失为什么会发生这种情况。任何人都可以提供一些见解吗?
如果我省略了任何必要的代码,我会道歉,可以根据要求更新!
答案 0 :(得分:3)
您的std::memset
来电是(a)多余的,如
pQA = new STRUCT_SPID_QA(); // <---- note the parens
value-初始化对象,在此处将整数初始化为0
并指向nullptr
。
和(b)实际上非常错误:
如果对象不是简单可复制的(例如,标量,数组或C兼容的结构),则行为未定义。
您的_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