c ++删除两个指针引用的对象

dan*_*tel 4 c++

我很好奇是否有一种优雅的方法来解决c ++中的以下问题:

我有一个模拟器应用程序,其中包含通过通道连接的几个组件.通道可以是网络通道(需要app的两个实例)或虚拟本地通道.有两个接口:IChannelInIChannelOut和两个相应的变量:

IChannelIn* in;
IChannelOut* out;
Run Code Online (Sandbox Code Playgroud)

DummyChannelIChannelInIChannelOut.它只是将输入复制到输出.还有TCPChannelIn: public IChannelIn和单独的TCPChannelOut: public IChannelOut.

现在,根据用户的选择,我要么创建一个 DummyChannel

DummyChannel* d = new DummyChannel;
in = d;
out = d;
Run Code Online (Sandbox Code Playgroud)

或两个单独的对象: in = new TCPChannelIn; out = new TcpChannelOut

问题是:析构函数应该做什么?

~App::App()
{
    delete in;
    delete out;
}
Run Code Online (Sandbox Code Playgroud)

以错误结束,因为delete in;删除了虚拟通道,d以便delete out删除已经删除的东西.

这有一种优雅的方式吗?

Chr*_*isF 9

你需要的东西是:

~App::App()
{
    if (in != out)
    {
        delete out;
    }
    delete in;
}
Run Code Online (Sandbox Code Playgroud)

当通道不同时,指针将是不同的.

然而,随着danatel已经指出了意见in,并out没有可比性.安全(但不优雅)的解决方案是使用dummy旗帜.设置if inout设置为虚拟通道,析构函数将变为:

~App::App()
{
    if (!dummy)
    {
        delete out;
    }
    delete in;
}
Run Code Online (Sandbox Code Playgroud)

虽然我对此不满意.

唯一的其他解决办法,我可以看到目前是改变的定义IChannelIn,并IChannelOut让他们可以安全地进行比较.


Ste*_*utt 7

如果你正在使用boost,你可以考虑使用boost :: shared_ptr 这将在最后一个实例发布时自动删除对象.