我知道析构函数本质上是一个释放内存的函数,或者只要你完成它就会“清理”。
我的问题是,正确的析构函数是什么?
让我向您展示我所拥有的课程的一些代码:
#ifndef TRUCK_H__
#define TRUCK_H__
#include <iostream>
#include "printer.h"
#include "nameserver.h"
#include "bottlingplant.h"
using namespace std;
class BottlingPlant; // forward declaration
class Truck {
public:
Truck( Printer &prt,
NameServer &nameServer,
BottlingPlant &plant,
unsigned int numVendingMachines,
unsigned int maxStockPerFlavour );
~Truck();
void action();
private:
Printer* printer; // stores printer
NameServer* ns; // stores nameserver
BottlingPlant* bottlingPlant; // stores bottlingplant
unsigned int numVM; // stores number of vendingmachine
unsigned int maxStock; // stores maxStock
unsigned int cargo[4]; // stores the cargo.
};
这是构造函数:
Truck::Truck( Printer &prt,
NameServer &nameServer,
BottlingPlant &plant,
unsigned int numVendingMachines,
unsigned int maxStockPerFlavour ) {
printer = &prt;
printer->print( Printer::Truck, 'S' );
ns = &nameServer;
bottlingPlant = &plant;
numVM = numVendingMachines;
maxStock = maxStockPerFlavour;
cargo[ 0 ] = 0;
cargo[ 1 ] = 0;
cargo[ 2 ] = 0;
cargo[ 3 ] = 0;
}//constructor
在我的析构函数类中,我应该在指针后清理吗?那是, 将它们设置为NULL?或删除它们?
即
Truck::~Truck()
{
printer = NULL; // or should this be delete printer?
ns = NULL;
bottlingPlant = NULL;
// anything else? or is it fine to leave the pointers the way they are?
}//destructor
感谢您的帮助,只是想养成创造适当的析构函数的好习惯。
答案 0 :(得分:6)
当您在对象中存储指针时,您需要清楚地了解谁拥有他们指向的内存。如果你的类是所有者,那么析构函数必须释放内存,否则你就会泄漏。如果您的班级不是所有者,那么您不得释放内存。
将点设置为NULL是不必要的,重要的是正确处理内存本身。
管理指针的一种更简单的方法是使用智能指针类,它将自动为您处理。
答案 1 :(得分:2)
由于你的指针没有从类中分配,所以删除和NULL都不在这里。由于指针是从课外传递的,所以请不要管它们。
实际上,您传入引用然后将它们转换为构造函数中的指针。这似乎没有必要。可能更好地将它们用作内部参考。真的取决于你的用例。如果你想使用指针,可能最好让你的构造函数接受指针。明确比隐含更好。