C/C++ 使用memset对目标进行清零时遇到的问题;

系统中有如下一段代码:

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对结构体清零时,首先看结构体的构成;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值