【发布时间】:2011-03-31 10:53:04
【问题描述】:
以“big 3”(构造函数、复制构造函数、析构函数)的简单类:
#include <vector>
using namespace std; //actually goes in the C file that links to this header file
...
class planets(){ //stores mass and radii data for planets in a solar system.
public:
vector <double> mass;
vector <double> radius;
//constructor
planets( int numObj ){
for(int i=0; i<numObj; i++){
mass.push_back(8.0); //some default values.
radius.push_back(2.0);
}
}
//copy constructor
planets(const planets &p){
vector <double> mass(p.mass); //copy vectors into new class.
vector <double> radius(p.radius);
}
//destructor
~planets(){
delete mass; //ERROR: (...) argument given to ‘delete’, expected pointer
~radius(); //also causes error: no match for call to(...)
}
}
我计划制作一个行星矢量,因此需要“big 3”:
vector <planets> stars;
stars.push_back(planets(5)); //5 hypothetical planets of alpha centauri
stars.push_back(planets(8)); //our solar system. Used to be nine.
///etc.
如何正确删除质量和半径向量,以避免内存泄漏(我什至必须这样做)?
【问题讨论】:
-
顺便说一句,您的复制构造函数(根本没有必要)没有做您认为它正在做的事情。
-
Nit:三巨头包括复制赋值运算符 (
operator=),而不是普通 ctor。 -
@dirkgently:这不是傻瓜,这是一个基本点!
-
@dirkgently:这个名字总是让我感到困惑。这应该是四规则。 (好的:我知道你可以摆脱三个,因为通过定义复制构造函数,你现在不再需要定义默认构造函数,但这很少有用,除了其他三个之外,你还需要一个普通的构造函数。跨度>
-
@Martin York:老实说,我已经思考了很长时间了。我能得出的唯一“合理”的事后理由是:假设您将定义一个演员。关键是,如果您定义了 other 三个中的任何一个,您可能会需要所有这些。任何人都可以拥有一个 ctor,但并非所有人都需要明确定义其他三个中的任何一个。 YMMV。
标签: c++ class memory-management vector destructor