方法(A)はnewやmalloc()等で明示的に獲得したものであり、deleteやfree()等で明示的に解放する必要がある方法です。
方法(B)とは、明示的な解放処理が不要なもので
①グローバル変数
②ローカル変数
③クラス内の静的変数
④クラス内のメンバ変数
等です。
この方法(A)と方法(B)について、適切な用語がないでしょうか?
一度簡単に説明すれば、その意味を想起しやすい用語が欲しいのです。
専門用語はないでしょうか? もしくは、分かりやすい用語を思いついた方がいらっしゃいましたら、是非教えて下さい。
(A)は「動的領域」のような用語で良いと思うのですが、(B)は良い言葉を思いつきません。④を含めたいのでなかなか良い用語がないのです。
④については、このクラスがnewで獲得されていた場合でも、このメンバ変数については明示的に解放する必要はありません。なので、明示的な解放が不要と言う意味で方法(B)に含めたいのです。
でも、「明示的解放不要領域」では長いし、生成方法の説明ではないので違和感が強いのです。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
+1
投稿します。
方法(B)とは、明示的な解放処理が不要なもので
①グローバル変数
②ローカル変数
③クラス内の静的変数
④クラス内のメンバ変数
等です。
この分類は、どうもうまくいかない様に思います。
ローカル変数としてポインタを定義した場合、
ポインタの中身はmallocすることもできると思いますが、
その場合、明示的な解放処理が必要で、
Chironianさんの分類ではどちらともいえない気がします。
データの保持先がスタック領域か、ヒープ領域か、静的領域か、
という分け方ならわかります。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
checkベストアンサー
0
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
ほかは「外部変数」「静的変数」の、合計3種類の「記憶クラス」があります。
次ページの「記憶クラス」の記述がご参考になるかと思います。
http://www9.plala.or.jp/sgwr-t/c/sec12.html
クラスのメンバー変数は、クラスのインスタンス自体の記憶クラスにゆだねられるわけで(グローバル変数としてインスタンスを作成されるか、自動変数として作成されるか、別のインスタンスの中に作成されるか...)、まさしくクラスインスタンスの「メンバー(変数)」なのでしょう。
ちなみに、mallocのような処理を自動変数として行いたい場合は _allocaという関数があります。こちらは必要量のメモリを(スタック領域から)確保しつつも、freeを書かずともスコープを抜けた時点でメモリを開放してくれます。
呼び名としては、new や malloc は「動的割り当て(変数)」、グローバル変数などではじめから確保しておき、プロセスの消滅で消えるものは「静的割り当て(変数)」、スコープを抜けると自動で消える局所変数は「自動変数」で、いかがでしょうかね...
http://www.geocities.co.jp/SiliconValley-Bay/7437/c/malloc.html
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
ちょっと気になる表現があるのですが、
一度簡単に説明すれば、その意味を想起しやすい用語が欲しいのです。もしかして、教育目的に使うのですか?それはやめた方が良いと思います。それぞれ個別にきっちり説明しないと。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 90.36%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2015/11/16 01:16
そして、ポインタの指す先の領域が動的生成領域であり、こちらは明示的に解放が必要になります。
2015/11/16 01:24
2015/11/16 01:43 編集
ところで、静的定義領域を指すこともあります。
#include <iostream>
class Foo {};
Foo GlobalFoo;
struct Bar
{
static Foo StaticFoo;
Foo MemberFoo;
};
Foo Bar::StaticFoo=Foo();
int main()
{
Foo LocalFoo;
Bar* p=new Bar;
Foo* q1=&GlobalFoo;
Foo* q2=&LocalFoo;
Foo* q3=&(Bar::StaticFoo);
Foo* q4=&(p->MemberFoo);
return 0;
}
この q1, q2, q3, q4のケースをうまいこと一言で表現したかったのですよ。
pは解放しないといけないのですが、q1~q4は解放してはいけないのです。
【追記】
上記のp, q1~q4自身(アドレスが記録されたポインタ)は全て方法(B)の領域です。
そして、pの指す先が方法(A)の領域です。
ついでに、q1~q4の指す先が方法(B)の領域です。
2015/11/16 01:57
その二つのケースがあることは理解しているつもりです。
「ポインタの中身はmallocすることもできますが」と書いた後のコメントだったので、
「(mallocで確保した)ポインタの指す領域は」と略して書いてしまいました。
でも、それならば新しい用語を作るより、
非ヒープ領域とでもした方が良いのでは無いでしょうか?
静的定義領域だと、一般的な用語でないので、
用語の説明がないと何のことかわからない人が多い気がします。
2015/11/16 02:00
2015/11/16 02:01 編集
q4はそのヒープ領域に確保した領域(MemberFoo)を指しているのですが、方法(B)に属するのです。なので、非ヒープ領域と表現できないのですよ。
実は、方法(B)を非ヒープ領域って呼び方を検討したのですが、上記理由で断念しました。
【追記】
> ヒープ領域以外に、解放が必要な領域ってあるんでしょうか?
ないわけではないですが、現在の議論では考えなくてよいと思います。
2015/11/16 02:22
具体的に説明していただいて、ありがとうございます。
それを踏まえて今考えたのですが、
struct BarにFoo *pMemberFooというメンバがあって、
コンストラクタでnewしてデストラクタでdeleteする場合、
それは「静的定義」とは呼びにくい様に思いますが、
どうでしょうか?
細かくてすみせん。
2015/11/16 02:40
newで獲得された*pMemberFooと言うFooのインスタンスは「動的生成領域」となります。
この2つは混同し易いのですが、それぞれ別のメモリが割り当てられており、異なる領域なのですよ。
遅くまでお付き合い下さり、ありがとうございました!!
それでは、お休みなさい。
2015/11/16 09:25
その二つが違うことは分かりますが、、
Foo* q5=p->pMemberFoo;
としたら、p->pMemberFooは動的生成領域を指すポインタなので、
同じ領域を指すq5は動的生成領域を指すポインタですよね?
でも、q5は解放してはまずいので(B)のケースに
当てはまるように思うのですが、どうでしょうか?
ということを言いたかったのです。
2015/11/16 12:37
q5自体ではなく、q5の指す先の領域について、その特性に応じた用語を定義したいのです。
q5の指す先は、この場合はnewで獲得されてますので「動的生成領域」です。
q5の指す先は、Barが責任を持って獲得/解放した場合でも、明示的に解放する必要があると言う事実は変わりません。
2015/11/16 14:10
そうだったのですね。
それが理解出来ていませんでした。
丁寧に教えていただいて、ありがとうございました。