繁体   English   中英

我需要删除载体吗?

[英]Do I need to delete a vector?

我将向量定义为Grid类的私有变量。 类积分只有两个实例变量,它们都是整数,但是只有从文件中读取积分时才知道积分的数量,所以我想我必须用新的动态制作积分,这意味着以后必须销毁它们。 我是否正确初始化了构造函数,并且在为Grid编写析构函数时是否需要为向量编写析构函数,例如:〜vecotr()或使用delete或使用迭代器?

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

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

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

如果由于某种原因确实为成员对象分配了new,则还必须创建自定义副本构造和赋值运算符,否则会遇到在多个实例之间共享同一成员对象的麻烦。

我会回答,因为在您提出更多问题时,前任仅回答了主题中的问题,我也会提供一些建议。 在本文的其余部分中,我们将假定如果Points确实分配了任何动态内存,则删除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 但是,如果我们假设您首先获得Points ,然后您将要创建网格,则这可能是可以的。 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()或使用delete或使用迭代器?

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

// fourth (and correct) option:
~Grid() {
}

或者只是完全销毁析构函数; 编译器生成的析构函数将在此处执行正确的操作。

如果使用new创建对象,则必须将其删除。 如果不这样做,就一定不要。

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

~Grid() { }

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM