我正在阅读IB api C++ code,并找到了以下类结构
class EWrapper;
class EClientSocketBase{
public:
EClientSocketBase( EWrapper *ptr): m_pEWrapper(ptr){}
~EClientSocketBase(){ }
// some methods
private:
EWrapper *m_pEWrapper;
// some other data members
};
class EPosixClientSocket : public EClientSocketBase{
// some methods and data members
EPosixClientSocket( EWrapper *ptr) : EClientSocketBase( ptr){}
~EPosixClientSocket(){}
};
class PosixTestClient : public EWrapper{
public:
PosixTestClient(): m_pClient(new EPosixClientSocket(this)){}
~PosixTestClient(){}
// some other methods
private:
std::auto_ptr<EPosixClientSocket> m_pClient;
// some other methods and data members
};
我对这段代码感到非常不舒服,特别是在delete
指针m_pEWrapper
没有放入EClientSocketBase
的析构函数时,对EPosixClientSocket
初始化this
感到更加不安{1}},但不知怎的,我无法清楚地说明错误到底是什么。
m_pClient
和指针m_pEWrapper
分别被删除了吗?您应该将delete m_pEWrapper
放在EClientSocketBase
的析构函数中吗?答案 0 :(得分:7)
该std::auto_ptr
的工作。它是:
智能指针,用于管理通过新表达式获取的对象,在
auto_ptr
本身被销毁时删除该对象。
所以在~PosixTestClient()
中,当m_pClient
被销毁时,它将delete
它正在管理的指针。这比自己打电话delete
要安全得多。
std::auto_ptr
不推荐使用std::unique_ptr
,这是一种非常优越的选择。