繁体   English   中英

我应该使用智能指针来传递“this”吗

[英]Should I use smart pointers for passing "this"

主要来自 C#,我正在学习如何最好地管理 c++ 中的 object 所有权,所以请耐心等待。

我有一个Bus class,它有一个名为OpenChannel的方法,它返回一个Channel object。 Bus保存了一个通道列表,因为如果Bus关闭,则所有通道都应该关闭。 如果单个通道关闭,总线仍保持打开状态,但应从Bus打开通道列表中删除该通道。

我计划处理此问题的方式如下:

std::unique_ptr<Channel> Bus::OpenChannel(int channel_number){
  int handle = //call dll to open channel
  
  auto chnl = std::make_unique<Channel>(this, channel_number, handle);
  this->open_channels_.push_back(chnl);
}

void Bus::OnChannelClosed(Channel channel){
    //remove from open_channels_
}

然后在通道class中,有一个close方法

void Channel::Close(){
  //make call to dll to close channel
  owning_bus_->OnChannelClosed(channel);
}

我想知道有两个方面——首先,对于传递给通道对象的构造函数的总线,我应该只使用常规指针,还是应该使用智能指针? 如果是智能指针,将“this”封装在一个中是否有意义? 第二,总线有一个公开的OnChannelClosed方法对我来说并不完全正确,该方法公开给任何 object 调用。 由于来自非通道 object 的调用,这可能会导致总线移除通道。 我可以让Channel成为Bus class 的朋友,但我的直觉是可能有更好的方法。

编辑:

根据一些回复,我想我会添加更多信息。 “总线”封装了一个 dll,它可以被初始化和未初始化(如果需要,可以再次重新初始化)。 未初始化时,所有打开的通道句柄 go 根据文档无效。 我开始认为我的库包装器应该有一个 Initialize、Uninitialize 和“CreateChannel”方法,该方法返回一个 Channel,然后可以对其进行操作。 从理论上讲,我永远不会在通道打开时取消初始化总线。 但如果它发生,我希望能优雅地处理它。 但是,如果我要公开通道,那么如果总线未初始化,则在另一个位置使用的通道 object 当然可能会失效。

我认为如果可能的话,处理这个问题的最好方法是,只要有开放的通道,就不允许总线未初始化。 也许可以使用共享指针来管理它? 或者可能根本不应该公开通道,并且总线方法都应该将通道号作为输入,然后调用将被委托给正确的通道。

关于你的第一个问题:

我想知道有两个方面——首先,对于传递给通道对象的构造函数的总线,我应该只使用常规指针,还是应该使用智能指针?

智能指针非常有用,因为它们无需手动跟踪 memory。 在您提供的示例中,您的 Bus class 只需要一个指向 Channel 的指针,以便它可以跟踪哪个 Channel 实例包含它。 在这种情况下,不需要使用智能指针,因为所有总线实例都应该在保存它们的通道之前被销毁。

第二,总线有一个公开的 OnChannelClosed 方法对我来说并不完全正确,该方法公开给任何 object 调用。

如果您所关心的是除 Bus 之外没有其他 class 应该能够调用方法OnChannelClosed ,您可以随时让 Bus 成为 Channel 的 class 的朋友,并将方法OnChannelClosed设置为私有或受保护。

然而,感觉你正在尝试用两种不同的方法来管理 memory,不过:

1-您希望 Channel 跟踪所有 Bus 实例,并且

2-您想使用智能指针,因此您根本不需要跟踪 memory。

我注意到的一件事是Bus::OpenChannel将 unique_ptr 存储在向量中,并且(可能)返回与 function 的 output 相同的 unique_ptr。 这是不可能的。 顾名思义,唯一指针只能由一个 object 拥有。 如果您需要多个对象来访问指针,您应该使用 shared_ptr 来代替。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM