a25_acl4_log01
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
* acl4の開発ログ #01
-(by [[K]], 2025.12.01)
** 2025.12.01(月) #0
-結局このスタイルが一番書きやすいので、これにしました(笑...
-標準関数の malloc/free/realloc の仕組みでは、mallocで得...
-リサイズするかもしれない時と、リサイズする予定が全くない...
-(なるほど、そうか。・・・ここに書くまで、自分が何に悩ん...
-ということで、mallocで得たメモリをreallocでサイズ変更す...
** 2025.12.01(月) #1
-acl4では、メモリをfreeするときもサイズを渡すことになって...
-解放時にサイズが分かれば、mallocのチェーン内にサイズ情報...
-だって4バイトとか8バイトとか16バイト程度の小さなメモリを...
-acl3やそれ以前でも「free時にもサイズを指定する」という仕...
** 2025.12.07(日) #0
-やっと「どこからどう作るべきか」がわかる瞬間が来た!よし...
** 2025.12.10(水) #0
-まだ「よしこの仕様で行こう!」と決めきれたわけではないの...
-以下のようなプログラムを用意します。
// t20251210a.c: メモリリーク実験.
#include "acl4.c"
int main(void)
{
char *a[5];
acl4_ini();
a[0] = Amalc(1); // mallocの代わりです.
a[1] = Amalc(3);
a[2] = Amalc(5);
a[3] = Amalc(7);
a[4] = Amalc(9);
Amfre(a[1], 3); // freeの代わりです.
Amfre(a[3], 7);
Amalc_debugList(); // a[0], a[2], a[4]は未開放なので...
return 0;
}
-これをコンパイルして実行するとこうなります(私は最近は V...
C:\rsd0027\progs\acl4>cl /nologo /O2 /MD t20251210a.c
t20251210a.c
C:\rsd0027\progs\acl4>dir t20251210a.exe [余計な表示はカ...
2025/12/10 10:37 10,240 t20251210a.exe
C:\rsd0027\progs\acl4>t20251210a
t20251210a.c(15): Amalc_debugList()
[p:0x00b4ccc8 siz:1 / t20251210a.c(8)]
[p:0x00b4c760 siz:5 / t20251210a.c(10)]
[p:0x00b530e8 siz:9 / t20251210a.c(12)]
C:\rsd0027\progs\acl4>
-このようにテストプログラムは10.0KBになって、未開放のメモ...
-プログラムの終了時や、もしくは適当なタイミングでこれを表...
----
-デバッグ時はこれでいいとして、リリース時にはこんな冗長な...
C:\rsd0027\progs\acl4>cl /nologo /O2 /MD /DADbgLv=0 t202...
t20251210a.c
C:\rsd0027\progs\acl4>dir t20251210a.exe [余計な表示はカ...
2025/12/10 10:49 7,680 t20251210a.exe
C:\rsd0027\progs\acl4>t20251210a
C:\rsd0027\progs\acl4>
-このように、実行ファイルは7.5KBになって、Amalc_debugList...
** 2025.12.10(水) #1
-この7.5KBというのが十分に小さいのかどうかという疑問が残...
// t20251210b.c: メモリリーク実験.
#include <stdlib.h>
int main(void)
{
char *a[5]; // acl4を全く使わなかったら何バイトにな...
a[0] = malloc(1);
a[1] = malloc(3);
a[2] = malloc(5);
a[3] = malloc(7);
a[4] = malloc(9);
free(a[1]);
free(a[3]);
return 0;
}
-これをコンパイルして実行するとこうなります。
C:\rsd0027\progs\acl4>cl /nologo /O2 /MD t20251210b.c
t20251210b.c
C:\rsd0027\progs\acl4>dir t20251210b.exe [余計な表示はカ...
2025/12/10 10:57 7,680 t20251210b.exe
C:\rsd0027\progs\acl4>t20251210b
C:\rsd0027\progs\acl4>
-このサイズは、ADbgLv=0のときのt20251210a.cと全く同じです。
-ということで、まあおおざっぱではありますが、サイズ的には...
-ちなみに、サイズ優先最適化である /O1 を指定して同じこと...
||/O1|/O2|
|t20251210a.c (ADgbLv=2)|RIGHT:9,216|RIGHT:10,240|
|t20251210a.c (ADbgLv=0)|RIGHT:7,680|RIGHT:7,680|
|t20251210b.c|RIGHT:7,680|RIGHT:7,680|
-ということで、 ADgbLv=0 にすれば、十分に消えてくれそうだ...
** 2025.12.10(水) #2
-Amfreでサイズ指定を間違えたらどうなるかの確認テストです。
// t20251210c.c: メモリサイズ指定ミス.
#include "acl4.c"
int main(void)
{
acl4_ini();
char *a = Amalc(1234);
Amfre(a, 123);
Amalc_debugList(); // ここには到達しないので、書いて...
return 0;
}
-実行結果はこうなります。うまくいっています。
C:\rsd0027\progs\acl4>t20251210c
t20251210c.c(8): Amfre: bad siz (head.siz=1234, arg.siz=...
C:\rsd0027\progs\acl4>
-内部のデバッグチェック用管理ヘッダには1234って書いてある...
-サイズを指定するのにはメモリ節約になる以外にもメリットが...
** 2025.12.10(水) #3
-Amfreで二重開放したらちゃんと教えてくれるかどうかのテス...
// t20251210d.c: 二重開放の検出テスト.
#include "acl4.c"
int main(void)
{
acl4_ini();
char *a = Amalc(1234);
Amfre(a, 1234);
Amfre(a, 1234); // これを検出してほしい.
Amalc_debugList();
return 0;
}
-実行結果はこうなります。うまくいっています。
C:\rsd0027\progs\acl4>t20251210d
t20251210d.c(9): Amfre: bad signature (head)
C:\rsd0027\progs\acl4>
-これはどういう原理かというと、ADbgLv=2のAmalc()は確保時...
-Amfre()にはこのシグネチャをチェックすることで、「Amalcで...
-また解放時にはこのシグネチャをクリアするので、二重開放時...
** 2025.12.10(水) #4
-Amalc_debugList()のやり方はうまいと思ったので、このやり...
** 2025.12.11(木) #0
-C言語ではC++みたいなRAII(Resource Acquisition Is Initia...
-でも人間なので呼び忘れてしまってリソースがリークしてしま...
-これで本決まりというわけではないですが、まあ自分が納得で...
-デストラクタを呼ばなくてもいいオブジェクトは表示されませ...
// t20251210e.c: 二重開放の検出テスト.
#include "acl4.c"
AClass(File) { // 新しいクラスを作る.
FILE *fp;
ADbgLv1_Aodi // デストラクタが必要なクラスでは、クラ...
};
Astatic void File_open(File *w, const char *p, const cha...
// コンストラクタ(引数リストにちょっと変なのをつける).
{
w->fp = fopen(p, m);
ADbgLv2_ini(w, "File"); // デストラクタが必要なクラ...
}
Astatic void File_close(File *w _ADbgLv2_FL4)
// デストラクタ(引数リストにちょっと変なのをつける).
{
fclose(w->fp);
ADbgLv2_dei(w); // デストラクタが必要なクラスでは、...
}
int main(void)
{
acl4_ini();
File f[3];
File_open(&f[0], "t20251210a.c", "rb" _1); // コンス...
File_open(&f[1], "t20251210b.c", "rb" _1);
File_open(&f[2], "t20251210c.c", "rb" _1);
File_close(&f[1] _1);
AObjMan_debugList(); // これで、openしたままになって...
return 0;
}
-[Q]変な引数が増えているけど、オーバーヘッドがあるんじゃ...
-[A]それは主に呼び出し時のソースコード上の行番号やファイ...
-実行結果はこの通りになります。うまくいっています。
C:\rsd0027\progs\acl4>t20251210e
t20251210e.c(31): AObjMan_debugList()
[p:0x00cffd1c class:File / t20251210e.c(27)]
[p:0x00cffd54 class:File / t20251210e.c(29)]
C:\rsd0027\progs\acl4>
終了行:
* acl4の開発ログ #01
-(by [[K]], 2025.12.01)
** 2025.12.01(月) #0
-結局このスタイルが一番書きやすいので、これにしました(笑...
-標準関数の malloc/free/realloc の仕組みでは、mallocで得...
-リサイズするかもしれない時と、リサイズする予定が全くない...
-(なるほど、そうか。・・・ここに書くまで、自分が何に悩ん...
-ということで、mallocで得たメモリをreallocでサイズ変更す...
** 2025.12.01(月) #1
-acl4では、メモリをfreeするときもサイズを渡すことになって...
-解放時にサイズが分かれば、mallocのチェーン内にサイズ情報...
-だって4バイトとか8バイトとか16バイト程度の小さなメモリを...
-acl3やそれ以前でも「free時にもサイズを指定する」という仕...
** 2025.12.07(日) #0
-やっと「どこからどう作るべきか」がわかる瞬間が来た!よし...
** 2025.12.10(水) #0
-まだ「よしこの仕様で行こう!」と決めきれたわけではないの...
-以下のようなプログラムを用意します。
// t20251210a.c: メモリリーク実験.
#include "acl4.c"
int main(void)
{
char *a[5];
acl4_ini();
a[0] = Amalc(1); // mallocの代わりです.
a[1] = Amalc(3);
a[2] = Amalc(5);
a[3] = Amalc(7);
a[4] = Amalc(9);
Amfre(a[1], 3); // freeの代わりです.
Amfre(a[3], 7);
Amalc_debugList(); // a[0], a[2], a[4]は未開放なので...
return 0;
}
-これをコンパイルして実行するとこうなります(私は最近は V...
C:\rsd0027\progs\acl4>cl /nologo /O2 /MD t20251210a.c
t20251210a.c
C:\rsd0027\progs\acl4>dir t20251210a.exe [余計な表示はカ...
2025/12/10 10:37 10,240 t20251210a.exe
C:\rsd0027\progs\acl4>t20251210a
t20251210a.c(15): Amalc_debugList()
[p:0x00b4ccc8 siz:1 / t20251210a.c(8)]
[p:0x00b4c760 siz:5 / t20251210a.c(10)]
[p:0x00b530e8 siz:9 / t20251210a.c(12)]
C:\rsd0027\progs\acl4>
-このようにテストプログラムは10.0KBになって、未開放のメモ...
-プログラムの終了時や、もしくは適当なタイミングでこれを表...
----
-デバッグ時はこれでいいとして、リリース時にはこんな冗長な...
C:\rsd0027\progs\acl4>cl /nologo /O2 /MD /DADbgLv=0 t202...
t20251210a.c
C:\rsd0027\progs\acl4>dir t20251210a.exe [余計な表示はカ...
2025/12/10 10:49 7,680 t20251210a.exe
C:\rsd0027\progs\acl4>t20251210a
C:\rsd0027\progs\acl4>
-このように、実行ファイルは7.5KBになって、Amalc_debugList...
** 2025.12.10(水) #1
-この7.5KBというのが十分に小さいのかどうかという疑問が残...
// t20251210b.c: メモリリーク実験.
#include <stdlib.h>
int main(void)
{
char *a[5]; // acl4を全く使わなかったら何バイトにな...
a[0] = malloc(1);
a[1] = malloc(3);
a[2] = malloc(5);
a[3] = malloc(7);
a[4] = malloc(9);
free(a[1]);
free(a[3]);
return 0;
}
-これをコンパイルして実行するとこうなります。
C:\rsd0027\progs\acl4>cl /nologo /O2 /MD t20251210b.c
t20251210b.c
C:\rsd0027\progs\acl4>dir t20251210b.exe [余計な表示はカ...
2025/12/10 10:57 7,680 t20251210b.exe
C:\rsd0027\progs\acl4>t20251210b
C:\rsd0027\progs\acl4>
-このサイズは、ADbgLv=0のときのt20251210a.cと全く同じです。
-ということで、まあおおざっぱではありますが、サイズ的には...
-ちなみに、サイズ優先最適化である /O1 を指定して同じこと...
||/O1|/O2|
|t20251210a.c (ADgbLv=2)|RIGHT:9,216|RIGHT:10,240|
|t20251210a.c (ADbgLv=0)|RIGHT:7,680|RIGHT:7,680|
|t20251210b.c|RIGHT:7,680|RIGHT:7,680|
-ということで、 ADgbLv=0 にすれば、十分に消えてくれそうだ...
** 2025.12.10(水) #2
-Amfreでサイズ指定を間違えたらどうなるかの確認テストです。
// t20251210c.c: メモリサイズ指定ミス.
#include "acl4.c"
int main(void)
{
acl4_ini();
char *a = Amalc(1234);
Amfre(a, 123);
Amalc_debugList(); // ここには到達しないので、書いて...
return 0;
}
-実行結果はこうなります。うまくいっています。
C:\rsd0027\progs\acl4>t20251210c
t20251210c.c(8): Amfre: bad siz (head.siz=1234, arg.siz=...
C:\rsd0027\progs\acl4>
-内部のデバッグチェック用管理ヘッダには1234って書いてある...
-サイズを指定するのにはメモリ節約になる以外にもメリットが...
** 2025.12.10(水) #3
-Amfreで二重開放したらちゃんと教えてくれるかどうかのテス...
// t20251210d.c: 二重開放の検出テスト.
#include "acl4.c"
int main(void)
{
acl4_ini();
char *a = Amalc(1234);
Amfre(a, 1234);
Amfre(a, 1234); // これを検出してほしい.
Amalc_debugList();
return 0;
}
-実行結果はこうなります。うまくいっています。
C:\rsd0027\progs\acl4>t20251210d
t20251210d.c(9): Amfre: bad signature (head)
C:\rsd0027\progs\acl4>
-これはどういう原理かというと、ADbgLv=2のAmalc()は確保時...
-Amfre()にはこのシグネチャをチェックすることで、「Amalcで...
-また解放時にはこのシグネチャをクリアするので、二重開放時...
** 2025.12.10(水) #4
-Amalc_debugList()のやり方はうまいと思ったので、このやり...
** 2025.12.11(木) #0
-C言語ではC++みたいなRAII(Resource Acquisition Is Initia...
-でも人間なので呼び忘れてしまってリソースがリークしてしま...
-これで本決まりというわけではないですが、まあ自分が納得で...
-デストラクタを呼ばなくてもいいオブジェクトは表示されませ...
// t20251210e.c: 二重開放の検出テスト.
#include "acl4.c"
AClass(File) { // 新しいクラスを作る.
FILE *fp;
ADbgLv1_Aodi // デストラクタが必要なクラスでは、クラ...
};
Astatic void File_open(File *w, const char *p, const cha...
// コンストラクタ(引数リストにちょっと変なのをつける).
{
w->fp = fopen(p, m);
ADbgLv2_ini(w, "File"); // デストラクタが必要なクラ...
}
Astatic void File_close(File *w _ADbgLv2_FL4)
// デストラクタ(引数リストにちょっと変なのをつける).
{
fclose(w->fp);
ADbgLv2_dei(w); // デストラクタが必要なクラスでは、...
}
int main(void)
{
acl4_ini();
File f[3];
File_open(&f[0], "t20251210a.c", "rb" _1); // コンス...
File_open(&f[1], "t20251210b.c", "rb" _1);
File_open(&f[2], "t20251210c.c", "rb" _1);
File_close(&f[1] _1);
AObjMan_debugList(); // これで、openしたままになって...
return 0;
}
-[Q]変な引数が増えているけど、オーバーヘッドがあるんじゃ...
-[A]それは主に呼び出し時のソースコード上の行番号やファイ...
-実行結果はこの通りになります。うまくいっています。
C:\rsd0027\progs\acl4>t20251210e
t20251210e.c(31): AObjMan_debugList()
[p:0x00cffd1c class:File / t20251210e.c(27)]
[p:0x00cffd54 class:File / t20251210e.c(29)]
C:\rsd0027\progs\acl4>
ページ名: