父类析构函数删除具有外部启动元素的子类
Parent class destructor deletes child classes with outside initiated elements?
Spaceship.h
#include <iostream>
#include <string>
#include <math.h>
#include <vector>
class Position {
public:
Position (std::string Name, double x, double y, double z);
private:
std::string Name;
double x, y, z; //Coordinates on a 3D map
};
class Flight {
public:
Flight (Position *Start, Position *End);
~Flight();
private:
Position *Start;
Position *End;
};
class Spaceship {
public:
Spaceship (std::string Name, Flight *flightPlan);
~Spaceship();
private:
std::string Name;
Flight *flightPlan;
};
class Universe {
public:
Universe ();
~Universe ();
void addSpaceship (Spaceship *Spaceship);
private:
std::vector <Spaceship*> *Spaceships; // A vector of Spaceship pointers
std::vector <Spaceship*>::iterator start, end;
int numberOfSpaceships;
};
宇宙飞船.cpp
#include "Spaceship.h"
Position::Position (std::string Name, double x, double y, double z) {
this->Name = Name;
this->x = x;
this->y = y;
this->z = z;
}
//------------------------------------------------------------
Flight::Flight (Position *Start, Position *End) {
this->Start = Start;
this->End = End;
}
Flight::~Flight () {
delete this->Start;
delete this->End;
}
//--------------------------------------------------------------
Spaceship::Spaceship (std::string Name, Flight *flightPlan) {
this->Name = Name;
this->flightPlan = flightPlan;
}
Spaceship::~Spaceship () {
delete this->flightPlan;
}
void Spaceship::printFlightPlan () {
std::cout << "Spaceship name: " << this->Name << std::endl;
this->flightPlan->printFlightPlan();
}
//---------------------------------------------------------------
Universe::Universe () {
this->Spaceships = new std::vector <Spaceship*>();
this->start = this->Spaceships->begin();
this->end = this->Spaceships->end();
this->numberOfSpaceships = Spaceships->size();
}
Universe::~Universe() {
delete this->Spaceships;
}
void Universe::addSpaceship(Spaceship *Spaceship) {
this->Spaceships->push_back(Spaceship);
this->start = this->Spaceships->begin();
this->end = this->Spaceships->end();
}
int main (void) {
Position *Start = new Position("Home", 45.566, 34.5677, -12.4565);
Position *End = new Position ("Far Far Away", 67.4564, -56.6765, 23.4565);
Flight *virginFlight = new Flight(Start, End);
Spaceship *sp1 = new Spaceship("Virgin Mary", virginFlight);
Spaceship *sp2 = new Spaceship("Something else", virginFlight);
Universe *alpha = new Universe();
alpha->addSpaceship(sp1);
alpha->addSpaceship(sp2);
delete alpha;
return 0;
}
好的,这应该是我代码中最干净的版本。它只有构造函数和析构函数。如果我错过了一些变量/函数,请假设它们在那里。这可以很好地编译和运行。我唯一的问题是内存泄漏。
瓦尔格林德报告分配>删除至少为2倍。
实际上 您的程序泄漏。这是由于代码中 Spaceship* 的 std::vector。STL 向量容器只有在包含对象而不是指向对象的指针时才会管理和释放其内部存储器。
在这里,当您将Spaceship添加到您的矢量并删除alpha时,将不会释放主程序中sp1和sp2指向的内存。
在现代C++中,您应该避免使用任何原始指针,而是尝试使用智能指针。在这里,我尝试更改您的代码,我认为现在不会泄漏。
太空船.h
#include <iostream>
#include <string>
#include <math.h>
#include <vector>
#include <memory>
class Position {
public:
Position(std::string Name, double x, double y, double z);
private:
std::string Name;
double x, y, z; //Coordinates on a 3D map
};
class Flight {
public:
Flight(Position *Start, Position *End);
~Flight();
void printFlightPlan();
private:
Position *Start;
Position *End;
};
class Spaceship {
public:
Spaceship(std::string Name, Flight *flightPlan);
~Spaceship();
void printFlightPlan();
private:
std::string Name;
Flight *flightPlan;
};
class Universe {
public:
Universe();
~Universe();
void addSpaceship(std::shared_ptr<Spaceship>);
private:
std::vector <std::shared_ptr<Spaceship>> *Spaceships; // A vector of Spaceship pointers
std::vector <std::shared_ptr<Spaceship>>::iterator start, end;
int numberOfSpaceships;
};
#include "Spaceship.h"
Position::Position(std::string Name, double x, double y, double z) {
this->Name = Name;
this->x = x;
this->y = y;
this->z = z;
}
//------------------------------------------------------------
Flight::Flight(Position *Start, Position *End) {
this->Start = Start;
this->End = End;
}
Flight::~Flight() {
/*delete this->Start;
delete this->End;*/
}
void Flight::printFlightPlan() {
}
//--------------------------------------------------------------
Spaceship::Spaceship(std::string Name, Flight *flightPlan) {
this->Name = Name;
this->flightPlan = flightPlan;
}
Spaceship::~Spaceship() {
delete this->flightPlan;
}
void Spaceship::printFlightPlan() {
std::cout << "Spaceship name: " << this->Name << std::endl;
this->flightPlan->printFlightPlan();
}
//---------------------------------------------------------------
Universe::Universe() {
this->Spaceships = new std::vector<std::shared_ptr<Spaceship>>;
this->start = this->Spaceships->begin();
this->end = this->Spaceships->end();
this->numberOfSpaceships = Spaceships->size();
}
Universe::~Universe() {
//delete this->Spaceships;
}
void Universe::addSpaceship(std::shared_ptr<Spaceship> Spaceship) {
this->Spaceships->push_back(Spaceship);
this->start = this->Spaceships->begin();
this->end = this->Spaceships->end();
}
int main(void) {
Position *Start = new Position("Home", 45.566, 34.5677, -12.4565);
Position *End = new Position("Far Far Away", 67.4564, -56.6765, 23.4565);
Flight *virginFlight = new Flight(Start, End);
std::shared_ptr<Spaceship> sp1(new Spaceship("Virgin Mary", virginFlight));
std::shared_ptr<Spaceship> sp2(new Spaceship("Something else", virginFlight));
Universe *alpha = new Universe();
alpha->addSpaceship(sp1);
alpha->addSpaceship(sp2);
delete alpha;
return 0;
}
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 使用strcpy将char数组的元素复制到另一个数组
- 使用不带参数的函数访问结构元素
- 给定n个元素的m个集合.在C++中找到出现在最大集合数中的元素
- C++如何通过用户输入删除列表元素
- lower_bound()返回最后一个元素
- 基于多个条件处理地图中的所有元素
- 调整大小后指向元素值的指针unordered_map有效?
- 使用std::transform将一个范围的元素添加到另一个范围中
- 使用函数"remove"删除重复元素
- 具有最大子序列大小的序列,每个元素都相同
- 如何创建一个空的全局类并在启动时实例化它
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 如何将元素添加到数组的线程安全函数?
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- 我想访问std::unique_ptr中的一个特定元素
- 如何通过 getter 函数删除矢量的元素?
- 编写一个递归功能,该功能采用数组并以相反顺序显示元素,而无需在末尾启动数组的索引
- 父类析构函数删除具有外部启动元素的子类