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

deletion of pointer that is a public class member

本文关键字:成员 指针 删除      更新时间:2023-10-16

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

struct myStruc
{
    int* m_p;
}

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

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

2。问题:如果指针被赋值给一个指针数组,例如

myStruct mS;
mS.m_p = new int[3];

是否有一个很好的方法(没有dynamic_cast或try-catch)现在,如果我必须做deletedelete[] ?

你不应该允许"用户"乱动数据结构中的指针。将指针设为私有并使用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; }
};

编辑:上面的类是不完整的,它是显示概念。对于一个完整的类,您将需要一个复制构造函数和一个赋值操作符,并且可能从allocate函数中"记住"n

现在您再也不用担心是否分配了[],因为它是一致的。

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

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

  1. 使用std::vector
  2. 使用智能指针作为成员,并根据您的用法语义选择正确的指针。

如果不能使用智能指针而必须使用原始指针,则:

  • 如果你使用new分配指针,那么使用delete,如果你使用new [],那么你需要使用delete []。不应该存在不匹配。
  • 每次动态分配的成员生命周期结束时,需要调用deletedelete []。假设该成员的生命周期与类的生命周期相同,它将位于析构函数中。
  • 重要的是你应该遵循三规则
    理想的在析构函数中。但是要遵循"三原则"。
  1. 应该使用delete[]new/new[]应分别使用delete/delte[]