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]
上面这种捕获是不允许的,=表示按值的方式捕获所有的变量,x相当于被重复捕获了。
1.2、params表示lambda的参数,用在{}中。
1.3、opt表示lambda的选项,例如mutable,后面会介绍一下mutable的用法。
1.4、

本文探讨了C++编程中使用printf和glog日志打印时的内存安全问题,强调了未指定c_str()可能导致的程序崩溃。同时,深入介绍了lambda表达式的捕获方式、参数、选项和返回值,以及异步回调中使用lambda可能导致的野指针问题。通过示例解释了如何正确使用lambda以避免内存错误,并提倡在捕获局部变量时使用值传递以确保安全性。
最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



