遺++のデストラクタの旋喘隈
峻さん、こんにちは。室宝蝕�kグル�`プの稼-看噛温敬温稼です。
仟定あけましておめでとうございます。云定もよろしくお垳いいたします。
云籾です。
書定も仟定あけて壼?に�g喘來0のネタ氏です。遺++から宣れて20定除く�Uちます。恷除は干温厩温や意霞沿艶皆界姻庄沿岳に乾れる字氏が謹いせいか、デストラクタの贋壓をすっかり梨れています。書指はそんなデストラクタを房い竃しながら、劣はこういうのに聞ってたなと房い竃に償ります。
朕肝
デストラクタ
デストラクタとは��
デストラクタは、オブジェクト峺�鰕墫錣任修離�ブジェクトを��茅する縞に柵び竃される�v方です。遺/遺++はメモリを鳩隠したら、きちんと盾慧してあげる駅勣があります。そのため、デストラクタでは、その鳩隠したメモリを盾慧するなどの朔頭原けを佩います。
干温厩温もオブジェクト峺�鰕墫錣任垢�、ガベ�`ジコレクタにてメモリを徭強蝕慧する碧怏みがあるため、デストラクタは贋壓しません。その旗わりファイナライザという、メモリが盾慧される岷念によばれる�I尖は贋壓します。デストラクタはメモリを徭蛍で砿尖するような冱囂によく需られる碧怏みです。
參和は、デストラクタの強きを�h苧したサンプルコ�`ドです。
class Example {
public:
Example() {
printf("This is the constructor.\n");
}
~Example() {
printf("This is the destructor.\n");
}
};
// メイン�I尖
int main() {
{
Example example;
printf("before\n");
}
printf("after\n");
return 0;
}This is the constructor.
before
This is the destructor.
afterExample exampleでコンストラクタが�I尖されます。このロ�`カル�篳�exampleのスコ�`プは{...}で�譴辰燭箸海蹐泙任如�{...}から翌れるとロ�`カル�篳�は盾慧されます。つまり、afterが柵ばれる念にデストラクタが�I尖されます。
デストラクタによるメモリの徭強蝕慧
そんなデストラクタを旋喘して、メモリの徭強蝕慧を�g廾してみます。枠ほども峰べた宥り、遺冱囂では鳩隠したメモリは、夭販もって蝕慧してあげる駅勣があります。しかし、メモリの盾慧梨れは吏?にしてよくあります。竃栖ればメモリの盾慧は徭強でやって圀しいですよね。ということで、デストラクタでメモリを盾慧してみました。
template <class T>
class MemPointer {
public:
T* ptr;
MemPointer(unsigned int size) {
this->ptr = (T*)malloc(size);
}
~MemPointer() {
free(this->ptr);
}
};クラスMemPointerは、コンストラクタで鳩隠したメモリを、デストラクタで盾慧します。このクラスMemPointerを慌宥クラスとして協吶し、みんながこのクラスでメモリを鳩隠すれば、盾慧梨れということは涙くなるでしょう。クラスMemPointerは參和のように聞います。
typedef struct _Person {
char name[256];
} Person;
// メイン�I尖
int main() {
{
MemPointer<Person> person(sizeof(Person));
memcpy(person.ptr->name, "n-ozawan", sizeof(Person::name));
printf("My name is %s\n", person.ptr->name);
} // ここでメモリが盾慧される
return 0;
}ただ、遺++11からスマ�`トポインタという碧��が擬秘されていますので、貧芝のようなやり圭はやめましょう。殆岷にstd::shared_ptrを聞った圭が措いです。
typedef struct _Person {
char name[256];
} Person;
int main(){
{
std::shared_ptr<Person> person(new Person());
memcpy(person->name, "n-ozawan", sizeof(Person::name));
printf("My name is %s\n", person->name);
} // ここでメモリが盾慧される
return 0;
}デストラクタでトレ�`スログ
その�v方の兵まりと嶮わりにトレ�`スログを竃薦する魁栽もデストラクタは宴旋です。
class LogTrace {
private:
const char* message;
public:
LogTrace(const char* message) {
this->message = message;
printf("[%s] start.\n", this->message);
}
~LogTrace() {
printf("[%s] end.\n", this->message);
}
};クラスLogTraceはコンストラクタで壊岳温姻岳を、デストラクタで艶稼糸のログを竃薦しています。クラスLogTraceは參和のように聞います。
void example(int value) {
LogTrace trace("example function");
if (value == 0) {
printf("value is 0.\n");
return ;
}
return ;
}
// メイン�I尖
int main() {
example(1);
example(0);
return 0;
}[example function] start.
[example function] end.
[example function] start.
value is 0.
[example function] end.トレ�`スしたい�v方の丹遊にLogTrace trace("example function");を慕くだけです。庄韓蛍瓷で余嶄嶮阻しても、諒籾なく艶稼糸ログが竃薦されています。
おわりに
遺/遺++を誘後する縞、いろんなサイトで茶膿しなおすのですが、暴が遺/遺++から宣れている寂に昧蛍いろんな字嬬が弖紗されていますね。暴が慕いているコ�`ドは硬株いかもしれません。
ではまた。
