はじめに
Linkedin Learning
は日本語ではなく英語で検索してみると、物凄い数の動画がありました。日本語だと2コースしかなかった C++講座
も 英語検索だと40種類以上もあった。これは、英語から逃げてきた私が英語を学ぶときがきた。 やはり、情報系は 英語
大切だなぁ、、、。
ちなみに Go
の動画も英語versionならあった、、、。
C++
スマートポインタ
前にも一度スマートポインタをしたが、便利さはわかったけど使い方がいまいちわからなかったのでもう一度スマートポインタについて調べてみる。
スマートポインタとは?
スマートポインタとは、 new
や delete
を勝手にしてくれる便利なポインタ変数である。
使ってみる
#include <iostream>
#include <memory>
//構造体を定義
struct X {
~X()
{
std::cout << "~X()" << std::endl;
}
int AAA( int a )
{
return a * 2;
}
};
int main()
{
int a = 5;
std::unique_ptr< X > ptr { new X() }; //shared_ptrでもOK
std::cout << ptr->AAA(5) << std::endl;
}
10
~X()
std::shared_ptr
と std::unique_ptr
の違いは、共有ができるかどうかである。unuque_ptr
はコピー不可能なクラスである。しかし、 std::move
を使うことで所有権を譲渡することができる。そのかわり、shared
に比べて 処理が早い。
譲渡ってなに?
#include <iostream>
#include <memory>
//構造体を定義
struct X {
~X()
{
std::cout << "~X()" << std::endl;
}
int AAA( int a )
{
return a * 2;
}
};
int main()
{
int a = 5;
std::unique_ptr< X > ptr { new X() };
std::unique_ptr< X > ptr2 = std::move(ptr);
std::cout << ptr2->AAA(10) << std::endl;
std::cout << ptr->AAA(5) << std::endl;
}
20
10
~X()
ん?ん????
ptr
から ptr2
に譲渡したら ptr
は使えなくなるものだと思ってたけど違うみたい。
ptr
を開放しても ptr2
には何も影響を及ぼさないが、 ptr2
を開放すれば、 ptr
も開放されるってことかな。また明日調べてみる。
make_shared使ってみた
#include <iostream>
#include <memory>
//構造体を定義
struct X {
~X()
{
std::cout << "~X()" << std::endl;
}
int AAA( int a )
{
return a * 2;
}
};
int main()
{
int a = 5;
auto ptr = std::make_shared< X >() ;
std::cout << ptr->AAA(5) << std::endl;
}
10
~X()
std::make_shared
を使うと new
も delete
も使わない! でも、 shared_ptr
などと違い auto
に入れる必要がある。
終わりに
スマートポインタに対して、苦手意識が消えたのでこれからは積極的に使っていこうと思う。
やはり、動画は本と違い、頭に入って来る。明日からはロベールとlinkedinの英語の動画を進める。
50日目いったから、目次みたいなページ作って、何日目で何やったかとかをまとめたい。(前書いたスマートポインタのページ探すのとても辛かった笑)