我正在使用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");
}
答案 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<>
的典型开销非常低,很少有真正重要的背景:尽可能多地使用它来避免此类问题。