2016-10-28 13 views
0

動的に割り当てられた変数はdelete演算子を使って削除する必要があり、静的変数の場合のようにスコープの最後で自動的に削除されません。C++ - 動的に割り当てられた変数のスコープ

したがって、ループが2回目と3回目に実行されている次の例では、 "int * p = new int;"動的に割り当てられたメモリ 'p'が削除されていないため、複数の初期化として扱われますか?

#include<iostream> 
using namespace std; 

void main() 
{ 
    int i = 2; 

    while (i > -1) 
    { 
    int *p=new int; 

    *p = 5; 

    cout << *p; 

    --i; 
    } 
} 

上記のプログラムでは、Visual Studio 2015を使用してもエラーは発生しません。私の理解によれば、これは意味をなさない。

私は動的に割り当てられた変数の理解に何か間違いがあると仮定しています。誰でも明確にしてもらえますか?

答えて

1

あなたのコードは、「メモリリーク」と呼ばれるものを示しています。 pが範囲外になると、各ループの反復に割り当てられたメモリは失われます。メモリが最初にdeleteになっていなければなりません。コンパイラがこの種のエラーを見つけるのは非常に複雑になる可能性があるため、これは(通常)コンパイラの警告やランタイムエラーにつながることはありません。いくつかのスタティックコードアナライザはこれを検出することができます。

メモリリークが発生した場合に気付くのは、プログラムが実行する時間が長くなるにつれてメモリがますます多く消費されることです。つまり、RAMが少ないシステムではメモリリークが特に問題となり、ええシステムサービスは数日間実行されるはずです。

メモリリークを検出するための特別なツールがあります。 Linuxの場合はvalgrind、Visual Studioの場合はデバッグランタイムのビルトインツールを使用します。

0

変数のみをオブジェクトに割り当てることはできません。

pは、*p - newで作成されたオブジェクトですが、動的に割り当てられたオブジェクトではありません。
delete pは、pではなく、それが指し示すオブジェクトを削除しません。

スコープは、名前に適用される構文コンパイル時のプロパティです。

名前を持つ変数pには有効範囲があります。
それが指すオブジェクトは名前がないので、スコープの概念はそれには適用されません。

pとそれが指しているオブジェクトの両方が有効です。

pの有効期間は、自動変数であるため、有効範囲と一致します。ループのすべての反復には、同じ名前を持つ独自の変数があります。変数が異なるため、複数の初期化はありません。

pが指すオブジェクトの有効期間は、そのアドレスがdeleteに渡されるまで続きます。
あなたはこれをしないので、newで作成したすべてのオブジェクトが "リーク"します。

関連する問題