1

私はProgress4GLアプリケーションから呼び出されるC言語関数で作業してきましたが、次の疑問がありました。

C関数はmallocを使用してcharの配列を動的に割り当てます。その考え方は、そのメモリを割り当てるポインタが、Cメソッドの結果を保持するために最初にMEMPTRデータ型を送信したProgress4GLプロセスに返されるというものです。

基本的に、ProgressからのMEMPTRをC関数に送信して、Cで生成された配列を「受信」し、スコープがde C関数から配列に戻るときに使用する必要があります(CメソッドがMEMPTRの進行状況を「埋める」両方の言語間の参照パス)変数)。

私の質問は:

Progressプロセスが終了し、MEMPTR変数が「解放」されると、C関数でmallocに割り当てられたメモリも解放されますか?

C関数でmallocに割り当てられたメモリを解放すると、Progressプロセスがガベージデータを受け取ると思いますが、これは正しいですか?

お手数をおかけしますが、よろしくお願いいたします。

ご挨拶。

4

2 に答える 2

3

4GL / ABL:WIN32 API関数の呼び出し方法:GetLongPathName

Progress 4GLは、そのメモリを管理しません。そのメモリの割り当てを解除/解放する方法を提供する必要があります。

はい、free()されたメモリにアクセスした場合、そのアクセスは未定義になります。クラッシュしたり、ガベージデータが表示されたり、プログラムがエラーなしでチャギングを続けたりする可能性があります。

免責事項:私はプログレスのために働いています。

于 2011-03-14T17:40:16.133 に答える
0

一般に、言語をまたがるプログラミング環境では、一方の言語がもう一方の言語によって割り当てられたメモリの割り当てを解除することを期待するのは悪い考えです。リソース(メモリなど)を割り当てる言語には、クライアントがリソースを使い終わったときにリソースの割り当てを解除するための対応する呼び出しが必要です。

特にCにはガベージコレクションがないため、Cによって割り当てられたメモリは手動で割り当てを解除する必要があります。

例外が1つあります。ほとんどの(組み込みではない)プラットフォームでは、割り当てられたすべてのリソースは、アプリケーションの終了時に再利用されます。したがって、割り当てが(ループなどで行われるのではなく)1回限りのスタートアップのみのタイプである場合は、手動で行うことを心配するのではなく、プログラムの終了時にOSに再利用させるだけで一般的に問題ありません。

于 2011-03-14T17:50:30.260 に答える