Page List

Search on the blog

2011年1月3日月曜日

C++のメモリ管理

最近、C++のnew、deleteについてなんとなく気になっていることがあったので、試しにプログラミングを作ってみた。
newして確保した領域は、関数を抜けるときには解放されるものだと思っていたがどうやら違うみたい。
よく考えてみると、newはstackじゃなくて、heapの方だから、関数をreturnしても解放されないんだよなーー。。
なんて不便な。。。

では、サンプルコードを。

  1. void func() {  
  2.  int *x = new int [100000000];  
  3.   
  4.  return;  
  5. }  
  6.   
  7. int main() {  
  8.   
  9.  REP(i, 10)  
  10.      func();  
  11.   
  12.  return 0;  
  13. }  

上のコードを実行するとエラーになります。windowsで利用できるアプリケーションのメモリ最大値は2GBなので、メモリリークを起こします。以下のようにきちんとdeleteするとエラーは起きません。

  1. void func() {  
  2.   int *x = new int [100000000];  
  3.   
  4.   delete x;  
  5.   return;  
  6. }  
  7.   
  8. int main() {  
  9.   
  10.   REP(i, 10)  
  11.       func();  
  12.   
  13.   return 0;  
  14. }  

deleteするときに注意しなければいけないことがあります。
deleteされるのは、その変数が現在指しているアドレス領域だということです。よって、以下のコードを実行すると、エラーがおきます。
int[10]はdeleteされますが、int[100000000]はdeleteされないのです。


  1. void func() {  
  2.    int *x = new int [100000000];  
  3.   
  4.    x = new int [10];  
  5.    delete x;  
  6.    return;  
  7. }  
  8.   
  9. int main() {  
  10.   
  11.    REP(i, 10)  
  12.        func();  
  13.   
  14.    return 0;  
  15. }  

0 件のコメント:

コメントを投稿