C++内存破坏导致的崩溃

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程经验随笔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值