1.当我们使用变参数函数例如printf或者glog里面的日志打印函数,在format里面使用string的参数的情况,而没有指定c_str()就会出现类似的问题,比如:
string str = "123456";
printf("%s",str);//错误,这有可能会崩溃,跟当时这块内存的状态有关
printf("%s",str.c_str());//正确;
内存破坏通常有两种结果,1.程序崩溃 2.程序虽然不崩溃,但是出现不符合预期的行为。
还有一种野指针的问题,在lambda表达式中引用的方式使用了调用函数中声明的局部标量,而lambda表达式又是在异步回调中被调用,这就导致函数中的局部变量已经被释放,这样再去闭包使用该标量就会有问题了,这个时候应该值传递的方式。
先来看一下lambda表达式的语法形式:
[ capture ] ( params ) opt -> ret { body; };
其中carpture是捕获列表,params是参数,opt是选项,ret则是返回值的类型,body则是函数的具体实现。
1.1、carpture捕获列表描述了lambda表达式可以访问上下文中的哪些变量。
[] :表示不捕获任何变量
[=]:表示按值捕获变量
[&]:表示按引用捕获变量
[this]:值传递捕获当前的this
但是捕获列表不允许变量的重复传递:例如[=,x]