新代码创建的指针在此代码中被删除的位置?

时间:2015-08-01 03:39:43

标签: c++ pointers c++11

我正在阅读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}},但不知怎的,我无法清楚地说明错误到底是什么。

  1. 要问的问题是指针m_pClient和指针m_pEWrapper分别被删除了吗?您应该将delete m_pEWrapper放在EClientSocketBase的析构函数中吗?
  2. 这段代码有什么问题吗?如果是,那是什么?如果没有,编写这样的代码是一个好习惯吗?

1 个答案:

答案 0 :(得分:7)

std::auto_ptr的工作。它是:

  

智能指针,用于管理通过新表达式获取的对象,auto_ptr本身被销毁时删除该对象

所以在~PosixTestClient()中,当m_pClient被销毁时,它将delete它正在管理的指针。这比自己打电话delete要安全得多。

<小时/> 请注意,在C ++ 11中,std::auto_ptr不推荐使用std::unique_ptr,这是一种非常优越的选择。