删除作为公共类成员的指针

时间:2013-04-10 14:31:40

标签: c++ pointers

我有一个结构/类,其成员是指针,比如说

struct myStruc
{
    int* m_p;
}

1。问题:我应该在哪里删除指针?在析构函数中?

myStruct::~myStruct()
{
    delete m_p;
}

2。问题:如果将指针指定给指针数组,例如

,该怎么办?
myStruct mS;
mS.m_p = new int[3];

如果我必须deletedelete[],是否有一种好方法(没有dynamic_cast或try-catch)?

3 个答案:

答案 0 :(得分:3)

您不应该允许“用户”弄乱数据结构中的指针。将指针设为私有,并使用get / set函数来访问它。

所以:

struct myStruc
{
  private:
    int* m_p;
  public:
    int* ptr() { return m_p; }
    void allocate(int n) { m_p = new int[n]; 
    myStruc() : m_p(0) {};
    ~myStruc() { delete [] m_p; }
};

编辑:上面的类不完整,它显示了这个概念。对于完整的类,您需要一个复制构造函数和赋值运算符,并且可能“记住”n函数中的allocate

现在你永远不必担心你是否与[]分配,因为它是一致的。

当然,您可以使用std::vector来实现此目的,而无需任何额外的努力。

答案 1 :(得分:2)

理想情况下,您根本不应使用原始指针成员。你有两个更好的选择:

  1. 使用std::vector
  2. 使用智能指针作为成员和choose the right one as per your usage semantic
  3. 如果你不能使用智能指针并且必须使用原始指针,那么:

    • 如果使用new分配指针,则使用delete,如果您使用new [],则需要使用delete []。应该没有不匹配。
    • 每次动态分配的成员的生命周期结束时,您都需要调用deletedelete []。假设该成员的生命周期与您的类的生命周期相同,它将在析构函数中。
    • 重要的一点是,您应该遵循 The Rule of Three

答案 2 :(得分:0)

  1. 理想情况下,在析构函数中。但请遵循Rule of Three
  2. 您应该使用delete[]new/new[]应分别使用delete/delte[]