gpt4 book ai didi

c++ - 如何在 gdb 中将 void 指针转换为 unique_ptr

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:33:15 25 4
gpt4 key购买 nike

我喜欢将 void 指针转换回 unique_ptr<T>使用任意类型 T,以便我可以将它取消引用到它的内容。但是使用以下简单示例:

#include <memory>

class Foo {
public: Foo(){};
};

int main() {
std::unique_ptr<Foo> p1 (new Foo);
void *p2 = (void*)&p1;
return 0;
}

我收到以下错误并且无法转换:

$ gdb ./unique-ptr
GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.2) 7.7.1
...
(gdb) b 10
Breakpoint 1 at 0x400682: file unique-ptr.cc, line 10.
(gdb) run
Starting program: /home/vagrant/c-test/unique-ptr/unique-ptr

Breakpoint 1, main () at unique-ptr.cc:10
10 return 0;
(gdb) p p1
$1 = std::unique_ptr<Foo> containing 0x603010
(gdb) p p2
$2 = (void *) 0x7fffffffea40
(gdb) p *(std::unique_ptr<Foo>*)p2
A syntax error in expression, near `)p2'.
(gdb)

实际用例是我喜欢打印出包含在容器类中的 unique_ptr 的内容,但这是目前阻止我更进一步的问题。

最佳答案

使用模板创建的实际类型名称不是 std::unique_ptr<Foo> .获取真实的类型名称:

(gdb) ptype p1 
type = class std::unique_ptr<Foo, std::default_delete<Foo> > [with _Tp = Foo, _Dp = std::default_delete<Foo>] {
private:
__tuple_type _M_t;
...

据此,我发现 gdb 可以识别 std::unique_ptr<Foo, std::default_delete<Foo> > ,我能够做到:

(gdb) p *(std::unique_ptr<Foo, std::default_delete<Foo> > *)p2
$3 = std::unique_ptr<Foo> containing 0x603010

匹配

(gdb) p p1
$1 = std::unique_ptr<Foo> containing 0x603010

关于c++ - 如何在 gdb 中将 void 指针转换为 unique_ptr<T>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40665973/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com