質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

4回答

5944閲覧

インスタンス生成方法の呼び方について

Chironian

総合スコア23272

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2015/11/15 13:18

編集2015/11/15 13:31

インスタンスを生成する方法を2つに分けることができます。newやmalloc()等を用いて生成する方法(A)と、それ以外の方法(B)です。

方法(A)はnewやmalloc()等で明示的に獲得したものであり、deleteやfree()等で明示的に解放する必要がある方法です。
方法(B)とは、明示的な解放処理が不要なもので
①グローバル変数
②ローカル変数
③クラス内の静的変数
④クラス内のメンバ変数
等です。
この方法(A)と方法(B)について、適切な用語がないでしょうか?

一度簡単に説明すれば、その意味を想起しやすい用語が欲しいのです。
専門用語はないでしょうか? もしくは、分かりやすい用語を思いついた方がいらっしゃいましたら、是非教えて下さい。

(A)は「動的領域」のような用語で良いと思うのですが、(B)は良い言葉を思いつきません。④を含めたいのでなかなか良い用語がないのです。
④については、このクラスがnewで獲得されていた場合でも、このメンバ変数については明示的に解放する必要はありません。なので、明示的な解放が不要と言う意味で方法(B)に含めたいのです。
でも、「明示的解放不要領域」では長いし、生成方法の説明ではないので違和感が強いのです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

すでにベストアンサーがついていますが気になったので
投稿します。

方法(B)とは、明示的な解放処理が不要なもので
①グローバル変数
②ローカル変数
③クラス内の静的変数
④クラス内のメンバ変数
等です。

この分類は、どうもうまくいかない様に思います。

ローカル変数としてポインタを定義した場合、
ポインタの中身はmallocすることもできると思いますが、
その場合、明示的な解放処理が必要で、
Chironianさんの分類ではどちらともいえない気がします。

データの保持先がスタック領域か、ヒープ領域か、静的領域か、
という分け方ならわかります。

投稿2015/11/15 15:40

eripong

総合スコア1546

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Chironian

2015/11/15 16:16

ポインタ自体はあくまでもアドレスを記録した領域です。この領域自体については明示的な解放はしません。 そして、ポインタの指す先の領域が動的生成領域であり、こちらは明示的に解放が必要になります。
eripong

2015/11/15 16:24

それは分かりますが、ポインタの指す領域はヒープ領域とは違うのですか?
Chironian

2015/11/15 16:58 編集

ポインタの指す先はnewやmalloc()で獲得した場合はヒープ領域ですよ。 ところで、静的定義領域を指すこともあります。 #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)の領域です。
eripong

2015/11/15 16:57

言葉足らずですみません。 その二つのケースがあることは理解しているつもりです。 「ポインタの中身はmallocすることもできますが」と書いた後のコメントだったので、 「(mallocで確保した)ポインタの指す領域は」と略して書いてしまいました。 でも、それならば新しい用語を作るより、 非ヒープ領域とでもした方が良いのでは無いでしょうか? 静的定義領域だと、一般的な用語でないので、 用語の説明がないと何のことかわからない人が多い気がします。
eripong

2015/11/15 17:00

ヒープ領域以外に、解放が必要な領域ってあるんでしょうか?
Chironian

2015/11/15 17:05 編集

Barはヒープに確保されてます。 q4はそのヒープ領域に確保した領域(MemberFoo)を指しているのですが、方法(B)に属するのです。なので、非ヒープ領域と表現できないのですよ。 実は、方法(B)を非ヒープ領域って呼び方を検討したのですが、上記理由で断念しました。 【追記】 > ヒープ領域以外に、解放が必要な領域ってあるんでしょうか? ないわけではないですが、現在の議論では考えなくてよいと思います。
eripong

2015/11/15 17:22

あ、その通りですね。 具体的に説明していただいて、ありがとうございます。 それを踏まえて今考えたのですが、 struct BarにFoo *pMemberFooというメンバがあって、 コンストラクタでnewしてデストラクタでdeleteする場合、 それは「静的定義」とは呼びにくい様に思いますが、 どうでしょうか? 細かくてすみせん。
Chironian

2015/11/15 17:40

pMemberFooと言う「Fooのインスタンスのアドレスを記録しているポインタ」自体は明示的な解放は不要なので「静的定義領域」になります。 newで獲得された*pMemberFooと言うFooのインスタンスは「動的生成領域」となります。 この2つは混同し易いのですが、それぞれ別のメモリが割り当てられており、異なる領域なのですよ。 遅くまでお付き合い下さり、ありがとうございました!! それでは、お休みなさい。
eripong

2015/11/16 00:25

また言葉が足りなかったようです。 その二つが違うことは分かりますが、、 Foo* q5=p->pMemberFoo; としたら、p->pMemberFooは動的生成領域を指すポインタなので、 同じ領域を指すq5は動的生成領域を指すポインタですよね? でも、q5は解放してはまずいので(B)のケースに 当てはまるように思うのですが、どうでしょうか? ということを言いたかったのです。
Chironian

2015/11/16 03:37

> でも、q5は解放してはまずいので(B)のケースに当てはまるように思う q5自体ではなく、q5の指す先の領域について、その特性に応じた用語を定義したいのです。 q5の指す先は、この場合はnewで獲得されてますので「動的生成領域」です。 q5の指す先は、Barが責任を持って獲得/解放した場合でも、明示的に解放する必要があると言う事実は変わりません。
eripong

2015/11/16 05:10

> q5自体ではなく、q5の指す先の領域について、その特性に応じた用語を定義したいのです。 そうだったのですね。 それが理解出来ていませんでした。 丁寧に教えていただいて、ありがとうございました。
guest

0

ベストアンサー

「コード定義領域」というのはどうでしょうか。インスタンスが配置される領域がコードに書かれた時点で確定しているという意味で思いついたのですが。これだとメンバ変数でも当てはまりそうな気がします。

投稿2015/11/15 14:38

catsforepaw

総合スコア5944

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Chironian

2015/11/15 15:11 編集

なるほど!! コードで定義されている領域ですね。定義って表現がしっくりきました。 ならば、動的生成領域に対する概念なので、静的定義領域とするとなんかよさげに感じます。どう思われます? てか、使ってみました。私の中では「静的定義領域」で決定しました。 ありがとうございました。
catsforepaw

2015/11/15 15:11

おお、決定したのですね。 ただ、「静的」が付くとstaticと混同してしまって自動変数やメンバ変数がしっくりこない感じになってしまいますが……。私も一瞬「動的」に対して「静的」が浮かんだのですが、前述の理由で「コード」にしてみたのですが。
Chironian

2015/11/15 16:11

やはり、そうでしたか。 テンプレートやconstexprはコンバイル時に処理してしまうから、「静的」と表現されることが多いです。これに対して、実行時の処理は「動的」ですね。 そのような文脈に近いので、私の中では「静的」で安定しました。 今開発中のライブラリは、テンプレート・メタ・プログラミングとかも使っているので、この中で使うのなら、たぶんあまり違和感を感じないと思うのです。 マジで「定義」を思いつかなかったので助かりました。変数名やコメントに苦しんでいたのですよ。ありがとうございます。
guest

0

性質の異なる物を一緒にしての呼び名なので、グルーピングの理由である「明示的解放不要領域」と呼ぶほか無いと思いますよ。他の名前にすると、「なぜこれとこれが同じグルーピングなのか」とかが分からなくなってしまう。

ちょっと気になる表現があるのですが、

一度簡単に説明すれば、その意味を想起しやすい用語が欲しいのです。

もしかして、教育目的に使うのですか?それはやめた方が良いと思います。それぞれ個別にきっちり説明しないと。

投稿2015/11/15 15:38

otn

総合スコア85773

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Chironian

2015/11/15 16:18

あ、使い方はちょっと上でも触れましたが、開発中のライブラリ内の変数名やコメントに使います。コメントはまだしも変数名は頭が痛いのです。長々と書きたくないし、こんな普通にお目にかからない概念に略号をあまり使いたくないし。
guest

0

「ローカル変数」とおっしゃられている変数(関数のスコープの中で(スタック領域内に)メモリ確保され、スコープを抜けるとfreeやdeleteなど書かずとも自動で解放される)は、「自動変数」と呼ばれていますね。
ほかは「外部変数」「静的変数」の、合計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

投稿2015/11/15 14:50

編集2015/11/15 15:00
hsk

総合スコア728

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Chironian

2015/11/15 15:11

ご回答ありがとうございます。 「静的割り当て」、「自動変数」のどちらとも、④のメンバ変数に対してイマイチしっくり来ません。 catsforepawさんのご提案で気がついたのですが、「生成」と考えるからよろしくなかったようです。「割り当て」も「生成」と似た概念なのでしっくり来ないようです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問