如何优雅的写C++代码( stack-use-after-scope问题)

代码如下:

for(int i = 0;i < 10;i++) {
        Thread t = Thread::New([&]{
            String filename = String::New("./tmp/download/file")
                              ->append(Integer::New(i)->toString()); //*出现异常
            ArchiveConnection c = ArchiveConnection::New(url);
            c->connect();
            c->download(String::New("testdata"),filename);
        });
        t->start();
    }

stack-use-after-scope貌似是说用栈超出生命周期的意思。我们看一下这个代码到底出了什么问题。*号出代码主要是调用了 一个i,然后转string。由于是多线程,所以可能出现这个循环跑完,线程都还没有跑起来,这个时候由于i的生命周期只在for循环内有效,所以当线程启动的时候,i已经没有了。所以出现了异常。

如何修复?这里直接把i作为参数直接传入lambda函数中。

for(int i = 0;i < 10;i++) {
        Thread t = Thread::New([&url](int count){
             String filename = String::New("./tmp/download/file")->append(Integer::New(count)->toString());
             ArchiveConnection c = ArchiveConnection::New(url);
             c->connect();
             c->download(String::New("testdata"),filename);
        },i);
        t->start();
    }

================================================================= ==21==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x6020000000a0 at pc 0x00000034c9e6 bp 0x7fff3f973bc0 sp 0x7fff3f973bb8 READ of size 4 at 0x6020000000a0 thread T0 #2 0x7f39d6e8e082 (/lib/x86_64-linux-gnu/libc.so.6+0x24082) 0x6020000000a0 is located 0 bytes to the right of 16-byte region [0x602000000090,0x6020000000a0) allocated by thread T0 here: #6 0x7f39d6e8e082 (/lib/x86_64-linux-gnu/libc.so.6+0x24082) Shadow bytes around the buggy address: 0x0c047fff7fc0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x0c047fff7fd0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x0c047fff7fe0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x0c047fff7ff0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x0c047fff8000: fa fa fd fa fa fa fd fa fa fa fd fa fa fa fd fa =>0x0c047fff8010: fa fa 00 00[fa]fa fa fa fa fa fa fa fa fa fa fa 0x0c047fff8020: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa 0x0c047fff8030: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa 0x0c047fff8040: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa 0x0c047fff8050: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa 0x0c047fff8060: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa Shadow byte legend (one shadow byte represents 8 application bytes): Addressable: 00 Partially addressable: 01 02 03 04 05 06 07 Heap left redzone: fa Freed heap region: fd Stack left redzone: f1 Stack mid redzone: f2 Stack right redzone: f3 Stack after return: f5 Stack use after scope: f8 Global redzone: f9 Global init order: f6 Poisoned by user: f7 Container overflow: fc Array cookie: ac Intra object redzone: bb ASan internal: fe Left alloca redzone: ca Right alloca redzone: cb Shadow gap: cc ==21==ABORTING
07-14
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值