系统中有如下一段代码:
typedef struct
{
// 其它项
std::vector<cv::Point2f> points1;
std::vector<cv::Point2f> points2;
}S_TARGET;
S_TARGET stTarget;
// 代码
memset(stTarget, 0, sizeof(S_TARGET));
// 函数调用,stTarget作为输出
getTarget( .., &stTarget);
//getTarget原型如下:
static void getTarget( ..., S_TARGET& stTarget)
{
// 代码
stTarget.points1.clear(); //第一次出错位置;
stTarget.points2.clear();
//Generate points
getPoints(stTarget.points1);
getPoints(stTarget.points2);
vector<Point2f> points = points1; //第二次出错位置
// 代码
}
XP系统,vs2010编译运行;
在release下,编译通过,短时间内运行正常;
在debug下,编译通过,运行出错;
调试代码后,发现第一个错误,采取了屏蔽代码的方式:
// stTarget.points1.clear(); //第一次出错位置;
// stTarget.points2.clear();
接着出现第二个错误;
运行报错: vector iterators incompatible
查找资料发现:
void *memset(void *s,int ch,size_t n); 是由C Run-time Library提供的提供的函数,作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法,而且可以跨平台使用。
memset用于清零时,会将结构中所有字节置0,
1. 如果结构体中有虚函数或结构体成员中有虚函数,则会将虚函数指针置0,如果后续程序调用虚函数,空指针很可能导致程序崩溃!因此,有虚函数或成员中有虚函数的结构体初始化,一定要用构造函数来完成。
2. 如果一个结构体中包含STL模板(Vector、List、Map等等),那么使用memset对这个结构体对象进行清零操作也会引起一系列的崩溃问题(指针指向内存错误、迭代器越界访问等)。
用memset对结构体清零时,首先看结构体的构成;