C++:清除对象向量时出现问题
C++: Issue with clearing a vector of objects
>编辑:这似乎是在我的结构上使用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++链接下正常工作
- 如何在C++向量中奇数元素前面加上值-1,我在使用insert函数时遇到了问题
- 添加存储在向量中的大整数的函数出现问题
- 尝试将向量初始化为类成员时出现问题
- 在将字符串放入字符串向量时遇到问题?
- 取消引用向量时出现问题
- 在C++中对结构向量进行排序时出现问题
- 在 c++ 中创建和访问 4D 向量时出现问题
- 数组为此合并排序函数提供了正确的输出,但向量给出了不正确的输出.出了什么问题?
- 使用指针向量(带代码)C++(以及对其使用的便利性的怀疑)时出现问题
- C++ 继承向量问题(无限循环+在其他类中使用向量的问题)
- 在 c++ 中访问列表向量时出现问题
- c++向量push_back问题
- shared_ptr类的向量的向量初始化问题
- SWIG c++到python:向量问题
- 在 Rcpp-Function 中使用布尔向量的子集(Rcpp 初学者的问题..)
- 无法取消引用超出范围的向量迭代器 - 有什么问题?
- 在构造函数中更新指针向量时出现问题
- 在使用 std::sort() 和 lambda 函数按属性对 ADT 的向量进行排序时遇到问题
- 为什么C++在自定义结构向量时会出现 ostream 重载问题?
- C++:问题向量 STL.