1

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

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[]

4

3 回答 3

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; }
};

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

现在您不必担心是否使用 [] 进行分配,因为它是一致的。

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

于 2013-04-10T14:41:25.473 回答
2

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

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

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

  • new如果你使用然后使用分配指针delete,如果你使用new []那么你需要使用delete []。不应该有不匹配。
  • 您需要在此动态分配成员的生命周期结束时调用deleteor 。delete []假设这个成员的生命周期与你的类的生命周期相同,它将在析构函数中。
  • 重要的部分是你应该遵循三法则
于 2013-04-10T14:33:06.433 回答
0
  1. 理想情况下在析构函数中。但遵循三法则
  2. 你应该使用delete[]. new/new[]delete/delte[]分别使用。
于 2013-04-10T14:32:36.863 回答