首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以从集合中提取包含唯一/共享指针的字段的结构?

是否可以从集合中提取包含唯一/共享指针的字段的结构?
EN

Stack Overflow用户
提问于 2021-07-28 00:04:42
回答 1查看 70关注 0票数 1

从本质上说,我有一组struct的实例,我想提取一个实例,修改字段。其中一个字段是唯一的ptr。我不太擅长读取c++错误,在提取时,该字段似乎被删除了。即调用唯一指针的析构函数。

在这里,当我试图访问字段“权重”时

我得到了这样的信息:

代码语言:javascript
复制
SUMMARY: AddressSanitizer: heap-use-after-free /usr/lib/llvm-11/include/c++/v1/memory:2490:19 in std::__1::unique_ptr<int, std::__1::default_delete<int> >::get() const
[ctest] Shadow bytes around the buggy address:
[ctest]   0x0c0e7fff84a0: fd fd fd fd fd fa fa fa fa fa fd fd fd fd fd fd
[ctest]   0x0c0e7fff84b0: fd fd fd fa fa fa fa fa fd fd fd fd fd fd fd fd
[ctest]   0x0c0e7fff84c0: fd fa fa fa fa fa fd fd fd fd fd fd fd fd fd fa
[ctest]   0x0c0e7fff84d0: fa fa fa fa 00 00 00 00 00 00 00 00 00 fa fa fa
[ctest]   0x0c0e7fff84e0: fa fa 00 00 00 00 00 00 00 00 00 fa fa fa fa fa
[ctest] =>0x0c0e7fff84f0: fd fd fd fd fd fd fd fd[fd]fa fa fa fa fa 00 00
[ctest]   0x0c0e7fff8500: 00 00 00 00 00 00 00 fa fa fa fa fa fa fa fa fa
[ctest]   0x0c0e7fff8510: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
[ctest]   0x0c0e7fff8520: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
[ctest]   0x0c0e7fff8530: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
[ctest]   0x0c0e7fff8540: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
[ctest] Shadow byte legend (one shadow byte represents 8 application bytes):
[ctest]   Addressable:           00
[ctest]   Partially addressable: 01 02 03 04 05 06 07 
[ctest]   Heap left redzone:       fa
[ctest]   Freed heap region:       fd
[ctest]   Stack left redzone:      f1
[ctest]   Stack mid redzone:       f2
[ctest]   Stack right redzone:     f3
[ctest]   Stack after return:      f5
[ctest]   Stack use after scope:   f8
[ctest]   Global redzone:          f9
[ctest]   Global init order:       f6
[ctest]   Poisoned by user:        f7
[ctest]   Container overflow:      fc
[ctest]   Array cookie:            ac
[ctest]   Intra object redzone:    bb
[ctest]   ASan internal:           fe
[ctest]   Left alloca redzone:     ca
[ctest]   Right alloca redzone:    cb
[ctest]   Shadow gap:              cc
代码语言:javascript
复制
Struct A {
    std::unique_ptr<int> weight;
}

auto& element = set_.extract(set_iterator).value();
std::cout << *(element.weight);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-28 00:11:18

该节点在提取时不会被删除,而是在您使用它之前不久删除。

具体来说,您不保存节点句柄.extract()返回,而是直接获得它管理的部分节点的引用

在完整语句的末尾,该引用会变得悬空,因为没有人保持节点句柄是活动的。

因此,AddressSanitizer检测堆后使用-无.

存储节点句柄,或保存所需节点的部分,但避免挂起引用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68552930

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档