遺++のデストラクタの旋喘隈

峻さん、こんにちは。室宝蝕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.
after

Example 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");を慕くだけです。庄韓蛍瓷で余嶄嶮阻しても、諒籾なく艶稼糸ログが竃薦されています。

おわりに

遺/遺++を誘後する縞、いろんなサイトで茶膿しなおすのですが、暴が遺/遺++から宣れている寂に昧蛍いろんな字嬬が弖紗されていますね。暴が慕いているコ`ドは硬株いかもしれません。

ではまた。


Recommendおすすめブログ