unique_ptrの基本とカスタムdelete

コード例

基本

unique_ptrは渡されたポインタの所有権を保持する。つまりこのポインタを解放するのはunique_ptrの役割である。ポインタが破棄されるのはunique_ptrが破棄される時かreset()によって他のポインタがセットされる時である。よってget()で取得したポインタを破棄したり、他のスマートポインタに渡してはいけない。

std::move

unique_ptrをunique_prtにコピーというか移動するにはstd::moveを使わなくてはならない。

カスタムデリート

unique_ptrの第2テンプレート引数にはデリーターを指定する。この関数は破棄される際にポインタが渡される。デフォルトはdeleteなので作成時にnewで作ったオブジェクトを渡す。しかしnewで作れないオブジェクトはたくさんあるのでコード例のようにカスタムデリーターを指定する。

std::function

カスタムデリーターはポインタ1つを引数に取る関数オブジェクトのを指定しなければならない。呼び出し規約がデフォルトと違う場合はそれも指定しないといけないのでややこしい。この場合はstd::functionを使えば呼び出し規約を気にしなくてもいい。

開放関数が引数を2つ取るなどの場合はラムダやファンクタを指定することになる。

ソースコード

https://github.com/ambiesoft/blogprogs/tree/master/5212

Visual Studio 2017でnew.hやctype.hが見つからない

このエラーに遭遇すた場合は必要なコンポーネントがインストールされていない可能性がありなおかつVisual Studioがそのことを認識してない可能性がある。

これを修正するにはまずVisual Studio Installerを起動する。

起動したときに自動更新が始まったら問題は解決できるかもしれない。更新を実行しそのまま閉じる(コンポーネントは今はインストールしない)。

次に対象のソリューションを開くと、必要なコンポーネントがインストールされていないためプロジェクトが読込できなくなっている場合がある。この場合はプロジェクトを右クリックしてから「必要なコンポーネントがインストールする」を実行すれば直せる。

Windows10でWindows Defenderを無効にする

Windows10のバージョン1803(2018年)の場合

Windows + Rで実行ダイアログを表示し、gpedit.mscと入力して、グループポリシーエディタを開く。

左のツリーから「コンピューターの構成」→「管理用テンプレート」→「Windows コンポーネント」→「Windows Defender ウイルス対策」を開く。

次に右のリストから「Windows Defender ウイルス対策を無効にします」をダブルクリックする。

ダイアログで、「有効」にチェックし、「OK」をクリックする。しばらくするとWindows Defenderは止まる。

Windows Defenderを無効に

タスクトレイのアイコンはレジストリのHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Runの配下のSecurityHealthから起動される。

タスクマネージャから無効にできる。

タスクマネージャでスタートアップを無効に

Autorunsを使っても無効にできる。

やり方その1(英語バージョンのみ?)(古いバージョン)

Windows + Rで実行ダイアログを表示し、gpedit.mscと入力して、グループポリシーエディタを開く

Run Group Policy

Computer Configuration⇒Administrative Templates⇒Windows Components⇒Windows Defendeを開き、Turn off Windows DefenderEnabledにする。

bbbdd57b-59dc-49aa-848e-c9b79014602a

5a7625d3-0ddb-4bcb-98f8-d08e10b3c418

やり方その2(おそらく全バージョン)

以下のレジストリの値(DWORD)を1にして再起動。

clipshot 2015-08-19 02-59-20

bashで2つのコマンドの実行結果のdiffを見る

Process-Substitutionを使う。

これを実行すると2つのechoが実行され、その結果をパイプとしてdiffに渡す。

失敗例

これだと、diff a bを実行したことと同じになってしまう。