[英]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.