a22_memman01
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
* メモリ管理 #1
-(by [[K]], 2022.02.03)
** (1)
-C++のスマートポインタや、Rustの所有権の考え方など、メモ...
-プログラマにとって一番気楽なのはガーベージコレクションの...
-C++のスマートポインタやRustの所有権の考え方は、自動変数...
-私はC言語でスマートポインタみたいなものを実現するにはど...
** (2)
-まずC言語では自動変数の寿命が切れても、そのタイミングでf...
-そこで、Cleanというクラス(の代わりの構造体と関数群)を...
-このClean_outをやり忘れるようなことがあると解放忘れにな...
[例1]
MyObjA *a = myMalloc(sizeof (MyObjA), &clean); // こう書...
MyObjA_init(a, &clean); // こう書...
// まあしかし、私ならinitの処理内容を工夫して、NULLを渡...
MyObjA *a = MyObjA_init(0, &clean);
** (3)
-Cleanオブジェクトは入れ子にできます。これはどういうこと...
-そうすると、もし子のCleanオブジェクトがClean_outし忘れて...
-また Clean_out のし忘れを見つけても、エラーにしないで、...
** (4)
-例えば、与えられた数値を16進数文字列にして返す関数があっ...
const char *toHex(int i)
{
char s[100];
sprintf(s, "%x", i);
char *p = malloc(strlen(s) + 1);
strcpy(p, s);
return p;
}
-これは受け取った文字列を使い終わった後にfreeしなければい...
-それが面倒なので、Cleanオブジェクトに自動登録するように...
const char *toHex(int i, Clean *c)
{
char s[100];
sprintf(s, "%x", i);
char *p = myMalloc(strlen(s) + 1, c);
strcpy(p, s);
return p;
}
-(ここまでは別に普通なのですが、ここからが面白いところで...
-ここで、この関数はかなりの頻度でi=0で呼び出されており、...
const char *toHex(int i, Clean *c)
{
if (i == 0) return "0"; // この行追加.
char s[100];
sprintf(s, "%x", i);
char *p = myMalloc(strlen(s) + 1, c);
strcpy(p, s);
return p;
}
-つまりこの関数は、ヒープエリア内のポインタを返すか、それ...
-もしCleanオブジェクトがなければ、その違いは使用後にfree...
-一般に、mallocやfreeは結構重たい関数なので、もしも前提条...
** (5)
-なお、このCleanクラスは、Objective-CのAutoReleaseの仕組...
終了行:
* メモリ管理 #1
-(by [[K]], 2022.02.03)
** (1)
-C++のスマートポインタや、Rustの所有権の考え方など、メモ...
-プログラマにとって一番気楽なのはガーベージコレクションの...
-C++のスマートポインタやRustの所有権の考え方は、自動変数...
-私はC言語でスマートポインタみたいなものを実現するにはど...
** (2)
-まずC言語では自動変数の寿命が切れても、そのタイミングでf...
-そこで、Cleanというクラス(の代わりの構造体と関数群)を...
-このClean_outをやり忘れるようなことがあると解放忘れにな...
[例1]
MyObjA *a = myMalloc(sizeof (MyObjA), &clean); // こう書...
MyObjA_init(a, &clean); // こう書...
// まあしかし、私ならinitの処理内容を工夫して、NULLを渡...
MyObjA *a = MyObjA_init(0, &clean);
** (3)
-Cleanオブジェクトは入れ子にできます。これはどういうこと...
-そうすると、もし子のCleanオブジェクトがClean_outし忘れて...
-また Clean_out のし忘れを見つけても、エラーにしないで、...
** (4)
-例えば、与えられた数値を16進数文字列にして返す関数があっ...
const char *toHex(int i)
{
char s[100];
sprintf(s, "%x", i);
char *p = malloc(strlen(s) + 1);
strcpy(p, s);
return p;
}
-これは受け取った文字列を使い終わった後にfreeしなければい...
-それが面倒なので、Cleanオブジェクトに自動登録するように...
const char *toHex(int i, Clean *c)
{
char s[100];
sprintf(s, "%x", i);
char *p = myMalloc(strlen(s) + 1, c);
strcpy(p, s);
return p;
}
-(ここまでは別に普通なのですが、ここからが面白いところで...
-ここで、この関数はかなりの頻度でi=0で呼び出されており、...
const char *toHex(int i, Clean *c)
{
if (i == 0) return "0"; // この行追加.
char s[100];
sprintf(s, "%x", i);
char *p = myMalloc(strlen(s) + 1, c);
strcpy(p, s);
return p;
}
-つまりこの関数は、ヒープエリア内のポインタを返すか、それ...
-もしCleanオブジェクトがなければ、その違いは使用後にfree...
-一般に、mallocやfreeは結構重たい関数なので、もしも前提条...
** (5)
-なお、このCleanクラスは、Objective-CのAutoReleaseの仕組...
ページ名: