- ベストアンサー
newしないオブジェクトについて
Vidocqの回答
静的、動的という認識を改めるべきです。 メモリにはスタック領域とヒープ領域というのがあり、 newによって獲得されたメモリはヒープ領域に格納されます。 これはプログラマが明示的でdeleteしないと削除されません。 一方、関数の中で int a = 0、などと宣言して使うローカル変数の場合、 これはプログラムの方で自動的にメモリを獲得します。 このメモリはスタック領域に格納されています。 関数を抜ける際に自動的にメモリを開放します。 newによるメモリ獲得はプログラマが 明示的に獲得、開放をしなければならないが、 関数で上記のローカル変数のように使われるものは プログラムが自動的に獲得・開放を行ってくれます。 静的→暗黙的、動的→明示的 と言い換える方が しっくりくるのではないでしょうか。
関連するQ&A
- C++のnewの使い道
最近C++を勉強しているのですが、new演算子はどういうときに使うべきでしょうか? メモリを動的確保できるのはわかります。 Cのmallocのようなものと考えていいのでしょうか? つまり、関数内でメモリを確保してそのアドレスを返すとか、コンパイル時に不明なサイズのメモリを実行時に確保するとか、任意のタイミングでメモリを開放したい場合などに使うものでしょうか。 ある参考書を読んでいると「引数つきコンストラクタを呼び出す場合はnewでインスタンス生成する」と書いてありました。 デフォルトコントラスタならnewなし、引数付きならnewあり、ということらしいです。 なぜこんなことをする必要があるのでしょうか?
- ベストアンサー
- C・C++・C#
- newでの動的生成について
質問ばかりで恐縮です。 周りに話の出来る人がいないので。 本にむやみにnewでオブジェクトを生成することはメモリリークの原因になるので避けたほうが良いとありました。 newはメモリを節約するためにある。 しかしながら、今のPCはメモリを十分つんでいる。 よってnewは使わないほうが良いとありました。 そこで知りたいのは、この話が本当かということもありますが、 それとは別に、newを使わざるを得ない時はどう言う時かということです。 CとC++とMFCそれぞれの場合においてどうなのでしょう?
- ベストアンサー
- C・C++・C#
- インスタンス?new?オブジェクト? の意味
String [ ] sa = new String [3] ; この一文の意味が全くわかりません。 この時いったい何が起きているのでしょうか。 String 型 というのは特にサイズが決まっていませんよね。 C言語で int a[5]; なら aという名前で int型のサイズの分だけ5個メモリが確保された、という意味になりますね。 領域が確保できるのは、int型のサイズが決定しているからです。 では String [ ] sa = new String [3] ; は? new はいったい何をしているのか。 仮にメモリに何かをロードしているのなら何をロードしているのか。 そしてそのロードしたものの役割は何なのか。 よろしくおねがいします
- ベストアンサー
- Java
- new と malloc によるメモリの動的確保について
初めて投稿させて頂きます。よろしくお願い致します。 現在、以下のような、2次元配列による動的なメモリの確保を意図して、コードをC/C++にて記述しています。 (コンパイラはMINGW32のg++ 3.4.5) //mallocによるメモリ動的確保 data = (char **)malloc(num * sizeof(char*)); for(i=0; i<rowNum; i++){ data[i] = (char *)malloc(sizeof(char)*256); } //newによるメモリ動的確保 data = new char*[rowNum]; for(i=0; i<rowNum; i++){ data[i] = new char; } C++で書くのならば、 「mallocによるメモリ確保は辞め、newによるメモリ確保をしなさい」 という指摘が、書籍でもwebでもありましたので、 両方書き、両者を比べているのですが、理由がイマイチ分かりません。 10万行ほどのテキストデータで実験させてみたのですが、 mallocによる記述の方が、動作が数秒速いようなのです。 それで、new やmalloc で実際何をやっているのか、コードを見ようと思ったのですが、 newでは、 void* operator new(std::size_t) throw (std::bad_alloc); void* operator new[](std::size_t) throw (std::bad_alloc); void* operator new(std::size_t, const std::nothrow_t&) throw(); void* operator new[](std::size_t, const std::nothrow_t&) throw(); inline void* operator new(std::size_t, void* __p) throw() { return __p; } inline void* operator new[](std::size_t, void* __p) throw() { return __p; } というnewファイルの記述で行き詰まり、 malloc は malloc_allocator.hというファイルで行き詰りました。 以上を踏まえて、 1)そもそも、上記のメモリ動的確保記述はスマートな書き方なのか 2)実際に、newやmallocは、どういった手法でメモリ領域を確保しているのか 以上の2点について、ご教授下さい。よろしくお願い致します。
- ベストアンサー
- C・C++・C#
- newを使った領域の動的確保
お世話になります。 C++での記述方法なのですが 構造体Testの領域を確保しておいて値を入れます。 確保しておいた領域では領域が不足するときに 不足分を追加したいのですがどうすればよいでしょう? Cではreallocを使えばよいと思うのですが C++ではmallocではなくnewを使ったほうがよいと聞きました。 newした領域を再定義した場合(deleteせずに領域を追加) 先に領域に入れたデータは保証されるのでしょうか? 以下例文ソース*部分 以下例文のソース Test *a; a = new TEST[10]; int cnt; int i; for(i = 0;i<10;i++){ //ここでTESTの配列aに値を入れる } cnt = 12; if( cnt > 10 ){ //予想サイズを上回ったら足りない分のサイズの領域を確保し //データを入れる a = new[cnt];//*ここで領域を再確保したら元のa[0]~a[9]の //データは確実に保持されるのか? //または他に領域を確保する方法があるのか? } 上記例文ソースでは先にcntで領域を確保すれば良いようにみえますが やりたいことは 先に確保されている領域を広げて 先に入れてあったデータと、広げた領域に入れたデータを使いたい のです。 分かりにくい文章かもしれませんがよろしくお願いします。
- ベストアンサー
- C・C++・C#
- pthread_detach
先日、C,C++カテゴリで質問していたのですが回答がつきませんでしたので、こちらで質問させていただきます。 pthread_create()してpthread_detachしているとします。 pthread_create()する前にmallocで領域確保した変数を引数として生成スレッドに渡しているとすると、detachした時点でmallocで確保した領域はfree()されるのでしょうか? それともメモリリークとなりますか?
- ベストアンサー
- その他(OS)
- c言語のmalloc関数、またrealloc関数
c言語のmalloc関数は確保するメモリの領域を、配列としてのみしか処理出来ないのですか。 つまり、malloc関数で確保したメモリの領域を変数、また多次元配列、また構造体としては処理出来ないのでしょうか。 c言語のrealloc関数は以前の確保したメモリの領域から、確保し直したメモリの領域の場所が変わるかもしれないという事ですが、この場合の場所が変わるという意味は、メモリの領域のアドレスが変わるという事でしょうか。 また、以前の確保したメモリの領域に代入していたデータが使用出来なくなるという事でしょうか。
- 締切済み
- C・C++・C#
- オブジェクトの生成やメモリの削除について
class X{ ........ ........ ........ } に対し、 X *a=new X;//--------------1 ... ... ... a=new X;//----------------2 としてdeleteせずにnewをした場合、1の段階で作ったオブジェクトは削除されずメモリに残りっぱなしになるのでしょうか? これは、プログラムを終了しても残り続けるものなのでしょうか? また、mallocやcallocの場合はどうなるのでしょうか?
- ベストアンサー
- C・C++・C#
お礼
ありがとうございました。