相关疑难解决方法(0)

何时使用reinterpret_cast?

我对reinterpret_castvs 的适用性感到困惑static_cast.从我读到的一般规则是使用静态转换,当类型可以在编译时解释,因此这个词static.这是C++编译器内部用于隐式转换的转换.

reinterpret_casts适用于两种情况,将整数类型转换为指针类型,反之亦然,或将一种指针类型转换为另一种指针类型.我得到的一般想法是不可移植的,应该避免.

我有点困惑的地方是我需要的一种用法,我从C调用C++并且C代码需要保持C++对象,所以基本上它拥有一个void*.什么演员应该用于在void *类型和类型之间进行转换?

我看过两者的用法static_castreinterpret_cast?虽然从我读过的内容看起来似乎static更好,因为演员阵容可以在编译时发生?虽然它说用于reinterpret_cast从一种指针类型转换为另一种指针类型?

c++ casting

432
推荐指数
6
解决办法
31万
查看次数

通过一个带有void*的C接口传递shared_ptr

我有一个使用SDL的C++项目,特别是SDL事件.我想将事件系统用于传入的网络消息,就像它用于UI事件一样.我可以定义一个新的事件类型并附加一些任意数据(参见这个例子).如果我使用普通指针,这就是我要做的事情:

Uint32 message_event_type = SDL_RegisterEvents(1);

/* In the main event loop */
while (SDL_Poll(&evt)) {
    if (evt.type == message_event_type) {
         Message *msg = evt.user.data1;
         handle_message(msg);
    }
}

/* Networking code, possibly in another thread */
Message *msg = read_message_from_network();
SDL_Event evt;
evt.type = message_event_type;
evt.user.data1 = msg;
SDL_PostEvent(evt);
Run Code Online (Sandbox Code Playgroud)

相反,我一直在使用shared_ptr<Message>.消息一旦构造就是只读对象,并且在处理时可能在很多地方使用,所以我想为它们使用shared_ptr.

我想将shared_ptr用于网络端的消息,也可以在事件处理端使用.如果我这样做:

// in networking code:
shared_ptr<Message> msg = ...
evt.user.data1 = msg.get();

// later, in event handling:
shared_ptr<Message> msg(evt.user.data1);
Run Code Online (Sandbox Code Playgroud)

然后有两个独立的shared_ptrs,任何一个都可以删除Message对象,而其中一个仍在使用它.我需要以某种方式通过SDL_UserEvent结构传递shared_ptr,该结构只有几个void *和int字段.

额外.注意 …

c++ sdl shared-ptr

6
推荐指数
2
解决办法
1201
查看次数

如何增加 std::shared 指针的所有权数量

我有一个具有指针作为成员的结构:

struct MyStruct {
  char *ptr;
}
Run Code Online (Sandbox Code Playgroud)

我想在一个范围内初始化 ptr,然后能够在该范围之外使用它:

{ // scope 0
    { //scope 1

        { // scope 2
            mystruct.ptr = new char[100];
        }

        // mystruct.ptr still lives here
    }

    // i dont need mystruct anymore
    delete[] mystruct.ptr;
}
Run Code Online (Sandbox Code Playgroud)

但后来我必须删除它,这很容易出错,我宁愿避免这样做。所以我想到使用std::shared_ptr.

{ // scope 0
    { //scope 1

        { // scope 2
            auto a = std::make_shared<char>(new char[100]);
            mystruct.ptr = a.get(); // ??????? HOW TO ASSIGN
        }

        // mystruct.ptr still SHOULD live here
    }
}
Run Code Online (Sandbox Code Playgroud)
  • 那么,我该怎么办呢?我应该如何将shared_ptr分配给mystruct.ptr以使所有权计数变为2?我看到 get() 不起作用,因为它只是传递指针但不给出所有权,因此它被删除。

  • 如您所见,这里的主要动机是延长寿命,因此我对其他做法持开放态度。也许我在这里使用shared_ptr的想法是错误的?

c++ smart-pointers object-lifetime lifetime-scoping

1
推荐指数
1
解决办法
7599
查看次数