删除了正在释放的delete []指针

时间:2014-10-10 12:10:56

标签: c++ new-operator

我正在使用new运算符来创建一个动态分配的数组(我正在使用这个数组,因为我想节省使用向量的内存开销)。析构函数中发生错误,表示释放的指针未被分配,尽管显然是这样。构造函数和析构函数如下:

~Path() {
    printf("Path Destructor\n");
    if(points) {
        delete[] points;
    }
}
Path(const std::vector<PathPoint>& points_) {
    size = points_.size();
    points = new PathPoint[size];
    int i = 0;
    for(const PathPoint& p : points_) {
        points[i++] = p;
    }
    printf("Path created\n");
}

1 个答案:

答案 0 :(得分:3)

您必须申请The Rule of Three

C ++标准说:

  

非联合类X的隐式定义的复制构造函数   执行其子对象的成员副本。 [n3126.pdf第12.8节   §16]

     

非联合类的隐式定义的复制赋值运算符   X执行其子对象的成员复制分配。 [n3126.pdf   第12.8§30节]

因此,Path类的隐式定义的复制构造函数和复制赋值运算符不会为您调用new[]

定义执行所需分配的复制构造函数和复制赋值oerator。


注意:

  • 您还可以使您的类型不可复制,无需定义声明它们:

E.g。 :

 Path( const Path& other );      // non construction-copyable
 Path& operator=( const Path& ); // non copyable

(或使用boost::noncopyable

  • std::vector<>的典型开销非常低,很少有真正重要的背景:尽可能多地使用它来避免此类问题。