どうしても解放がしたいのならこんな方法もあります。
dupptr で メモリ全体に割り当ててもいいのですが。
メモリ効率が悪くなりますが、
割り当てられたメモリが、内部でどうなっているのか解らないのであえて4byteずつアクセス
する方法を取っています。
自分の環境では、heap ハンドルを削除しない限り
そのメモリアドレスにアクセスすることは可能みたいです。
#uselib "kernel32.dll"
#cfunc HeapCreate "HeapCreate" int,int,int
#cfunc HeapAlloc "HeapAlloc" int,int,int
#func HeapFree "HeapFree" int,int,int
#func HeapDestroy "HeapDestroy" int
#cfunc IsBadCodePtr "IsBadCodePtr" int
#const MEMORYSIZE 16
#define HEAP_ZERO_MEMORY $00000008
#module heap
#defcfunc lPeekPtr int ptr_
dupptr mem,ptr_,4,4//vartype("int")
return mem
#deffunc lPokePtr int ptr_ , int add_
dupptr mem,ptr_,4,4//vartype("int")
mem = add_
return
#global
hHeap = HeapCreate(0,100,0xFFFF)
if hHeap==0:dialog "heapの作成に失敗":end
ptr_a = HeapAlloc(hHeap,HEAP_ZERO_MEMORY,4*10)
mes "※36byte目 (int配列で9番目 の アドレスに 555555) を代入"
lPokePtr ptr_a+(4*9) , 555555
gosub *print_
mes "※20byte目 (int配列で9番目 の アドレスに 111111) を代入"
lPokePtr ptr_a+(4*5) , 111111
gosub *print_
mes "※解放してみる"
HeapFree hHeap , 0 , ptr_a
gosub *print_
mes "※heapハンドルを削除してみる"
HeapDestroy hHeap
gosub *print_
stop
*print_
color 255
if IsBadCodePtr(ptr_a): mes "\tアクセスできなくなったみたい" :return
txt = "\t"+lpeekptr(ptr_a)
repeat 9,1
txt+=strf(",%d",lpeekptr(ptr_a+(4*cnt)))
loop
mes txt
color
return