C++ 未分配要释放的delete[]指针

C++ 未分配要释放的delete[]指针,c++,new-operator,C++,New Operator,我使用new操作符创建一个动态分配的数组(我使用这个是因为我想节省使用向量的内存开销)。该错误发生在析构函数中,表示被释放的指针没有被分配,尽管它显然是被分配的。构造函数和析构函数如下所示: ~Path() { printf("Path Destructor\n"); if(points) { delete[] points; } } Path(const std::vector<PathPoint>& points_) { s

我使用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");
}
~Path(){
printf(“路径析构函数”);
如果(点数){
删除[]点;
}
}
路径(常数标准::向量和点){
大小=点大小();
点=新路径点[大小];
int i=0;
用于(常量路径点&p:points_u2;){
点[i++]=p;
}
printf(“创建的路径”);
}
您必须申请:

< C++标准>:

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

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

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

定义执行所需分配的复制构造函数和复制分配生成器


注意:

  • 您还可以使您的类型不可复制,在不定义的情况下声明它们:
例如:

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

  • std::vector
    的典型开销非常低,很少有真正重要的上下文:尽可能多地使用它来避免此类问题
    • 您必须申请:

      < C++标准>:

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

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

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

      定义执行所需分配的复制构造函数和复制分配生成器


      注意:

      • 您还可以使您的类型不可复制,在不定义的情况下声明它们:
      例如:

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

      • std::vector
        的典型开销非常低,很少有真正重要的上下文:尽可能多地使用它来避免此类问题
        • 您必须申请:

          < C++标准>:

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

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

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

          定义执行所需分配的复制构造函数和复制分配生成器


          注意:

          • 您还可以使您的类型不可复制,在不定义的情况下声明它们:
          例如:

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

          • std::vector
            的典型开销非常低,很少有真正重要的上下文:尽可能多地使用它来避免此类问题
            • 您必须申请:

              < C++标准>:

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

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

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

              定义执行所需分配的复制构造函数和复制分配生成器


              注意:

              • 您还可以使您的类型不可复制,在不定义的情况下声明它们:
              例如:

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

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

              什么是
              点大小()
              ?还有其他构造函数吗?向量的内存开销是多少?您是否定义了复制构造函数和/或复制赋值运算符?@n尽管不同,大小通常为1-5。在我的情况下,它崩溃了2次,但我认为这无关紧要。没有默认构造函数。是的,复制和赋值在这里很重要。阅读“三分法则”,或使用C++11“零(或五分法则)”(RAII)。什么是
              points\uuu.size()
              ?还有其他构造函数吗?向量的内存开销是多少?您是否定义了复制构造函数和/或复制赋值运算符?@n尽管不同,大小通常为1-5。在我的情况下,它崩溃了2次,但我认为这无关紧要。没有默认构造函数。是的,复制和赋值在这里很重要。阅读“三分法则”,或使用C++11“零(或五分法则)”(RAII)。什么是
              points\uuu.size()
              ?还有其他构造函数吗?向量的内存开销是多少?您是否定义了复制构造函数和/或复制赋值运算符?@n尽管不同,大小通常为1-5。在我的情况下,它崩溃了2次,但我认为这无关紧要。没有默认构造函数。是的,复制和赋值在这里很重要。读一读“三的规则”,或者用C++11读一读“零(或五)的规则”(RAII)。什么是
              积分