1

我将向量定义为类 Grid 的私有变量。类 Points 只有两个实例变量,它们都是整数,但只有当我从文件中读取它时才会知道点的数量,所以我想我必须用 new 动态地创建 Points,这意味着我必须稍后销毁它们。我是否正确初始化了构造函数,并且在为 Grid 编写析构函数时,是否需要为向量编写析构函数,如下所示:~vecotr() 或删除或使用迭代器?

class Grid{
public:
  // initialize vector with 3 points with val 0.
  Grid(vector<Points> v) : vector<Points>(3, 0) {};  // is this right


// first option
  ~Grid() {
    ~vector<Points>();  // not sure how to destroy vector<Points>;
  }

// second option
  ~Grid() {
     delete v_points;
  }

// third option
  ~Grid() {
     for (vector<Points>::iterator it = v_points.begin(), 
          vector<Points>::iterator it_end = v_points.end(); it != it_end; it++)
  }

private:
  vector<Points> v_points;
};

我应该使用哪个选项,我是否正确初始化了构造函数?

4

4 回答 4

9

如果对象不是用 分配的new,则不需要显式销毁它。成员对象将按照其声明的相反顺序自动销毁。在您的情况下,甚至不需要创建析构函数,因为自动析构函数就足够了。

如果由于某种原因您确实为成员对象分配了 new,那么您还必须创建自定义复制构造和赋值运算符,否则您会遇到跨多个实例共享相同成员对象的麻烦。

于 2013-08-30T01:35:32.073 回答
1

我会回复,因为前辈只回答了主题中的问题,而您提出更多问题,我也会给出一些建议。在本文的其余部分中,我们将假设如果Points确实分配了任何动态内存,则内存在Points被删除时会正确返回。

类 Points 只有两个实例变量,它们都是整数,但只有当我从文件中读取它时才会知道点的数量,所以我想我必须用 new 动态地创建 Points,这意味着我必须稍后销毁它们。

这与您在此处实际执行的操作相矛盾

class Grid{
public:
  // initialize vector with 3 points with val 0.
  Grid(vector<Points> v) : vector<Points>(3, 0) {};  // is this right

private:
  vector<Points> v_points;
};

因为您创建了没有new. 但是,如果我们假设您首先获得 number ofPoints然后您将要创建一个 Grid,这可能没问题。std::vector不是 C 数组,可以轻松调整大小、分配并提供更大的灵活性。您不必在堆上创建它,因为您担心大小:向量元素总是在堆上创建,它只是一个向量本身(如果它是)在堆栈上。这通常正是我们想要的(参见RAII)。初始化向量的正确方法是

class Grid{
    public:
      // initialize vector with 3 Points with val Points(0)
      Grid(vector<Points> v) : v_points(3, Points(0)) {};

    private:
      vector<Points> v_points;
};

注意,我们在初始化列表中进行。对于 POD 类成员来说,这没有什么区别,只是风格问题。对于作为类的类成员,它避免了对默认构造函数的不必要调用。

我是否正确初始化了构造函数,并且在为 Grid 编写析构函数时,是否需要为向量编写析构函数,如下所示:~vecotr() 或删除或使用迭代器?

您不初始化构造函数,而是在构造函数初始化器列表中初始化类成员。由于 vector 未分配new,因此您不会使用delete它(调用delete)。销毁时会自动Grid销毁。

于 2013-08-30T03:14:46.523 回答
1
// fourth (and correct) option:
~Grid() {
}

或者完全省略析构函数;编译器生成的析构函数将在这里做正确的事情。

如果你创建一个对象,new你必须删除它。如果你不这样做,你就不能。

于 2013-08-30T13:14:17.777 回答
0

我假设Points没有任何动态分配的内存。如果是这种情况,那么您所需要的就是

~Grid() { }

如果是这样,那么您需要为向量中的每个项目删除动态分配的内存(或使用智能指针)。

于 2013-08-30T01:35:12.730 回答