new~deleteを使う場合と、使わない場合の、違いは? – プログラミング – Home

new~deleteを使う場合と、使わ...
 
通知
すべてクリア

[解決済] new~deleteを使う場合と、使わない場合の、違いは?


まに
 まに
(@まに)
ゲスト
結合: 18年前
投稿: 78
Topic starter  

他人が作ったプログラムの中で、以下の関数Aのように、new~deleteを使ってメモリを確
保してる関数があります。

●関数A
void funca(void)
{
  char *buf = new char[256];
  ・
  ・
  ・
  delete [] buf;
}

上記の関数Aは、以下の関数Bのように、new~deleteを使わなくてもまったく同じことが
実現できると思いますが、その認識で合ってますでしょうか?ちなみに処理の中で、メモ
リ再確保などは行いません。

●関数B
void funcb(void)
{
  char buf[256];
  ・
  ・
  ・
}

関数Aの記述と関数Bの記述とで、実際の処理内容が違うなんてことはありますか?
(関数Aの記述ではOKだけど関数Bの記述ではNGな処理とか)

関数Aのやり方と関数Bのやり方の、違いを教えてください。
メモリがヒープに確保されるかスタッフ領域に確保されるかの違いだけでしょうか?

よろしくお願いします。


引用未解決
トピックタグ
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

うーーん、
僕の場合、
  1. メモリーの容量が多い場合(1Mバイト以上)
2. 画像処理等で「new~delete」が必要な場合。
3. 途中でグローバルな関数を使っている場合。
    (通信やファイル処理の関数で「call-back関数」を読んでいる場合)
4. 複数のスレッドの共有メモリーで使う場合。
ぐらいでしょうか?

 WIN32APIを使う場合も、「new~delete」が必要な場合があるみたいですね。
リストをよく見たほうがいいですね。
他人が作ったソフトだと、古いVC(VC6.0等)作った部分がそのまま残っている
可能性もあると思います。

     


返信引用
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

CPUの動作がまったく異なります。

関数A.
 newオペレータが実行されると、bufポインタに「フリーストア」という領域から
 256Byteのメモリーを確保します。
 deleteオペレータが実行されると、bufに確保したメモリーを「フリーストア」に
 戻します。

関数B.
 char型の []オペレータが実行されると、「スタック」という領域から
 256Byteのメモリーを確保し、そのポインタをbufに代入します。
 関数から抜けるときに、これはを含めてその関数が「スタック」に確保した全ての
 メモリーが戻されます。

Windowsの場合、
A.フリーストアから確保できるメモリーの限度は32bitの場合
 プロセスあたり約2GByteです。
B.スタックはスレッドあたり、呼び出して実行中の関数の一連に対して、2
 MByteがデフォルト値です。
 コンパイルオプションで変更することができます。

従って、大量に使用するとスタックはたやすく枯渇しますが、
フリーストアはそう簡単に不足することはありません。


返信引用
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

orz.
×CPUの動作がまったく異なります。
○関数の動作がまったく異なります。


返信引用
まに
 まに
(@まに)
ゲスト
結合: 18年前
投稿: 78
Topic starter  

返信が遅くなりスミマセンでした。
関数内で特別なことはしてないし、確保領域もそれほど大量ではありません。
なので違いはなさそうですね。お二方、ありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました