0

ポインターをnullに初期化するコードを読んでいます。最初は、コードが値の2次元配列を格納するためのポインターに新しいメモリを割り当てていないと思っていました(これはそうです)。割り当てられたメモリ?

class Int8_tSet : public GridSet
{
public:
  int8_t** set;
//
//
  Int8_tSet():set(0) {}
  Int8_tSet( const Int8_tSet& x ):set(0) {copy(x);}
  virtual ~Int8_tSet() { Free2DArray(set);}
//
// --- opeartor
  int8_t  operator() ( IntVector2D x ) const {return set[x.i][x.j];}
  int8_t& operator() ( IntVector2D x ) {return set[x.i][x.j];}
// --- function
  void Set();
  void Set(int8_t val);
  void Set( IntVector2D x ){ NS_GRIDDATA::Set(x,*this,(int8_t)-1); }
  void Set( IntVector2D x,int8_t val){ NS_GRIDDATA::Set(x,*this,val); }
  void Switch();
// --- output & input
  void Output(std::ostream& out ) const;
  void Input (std::istream& in  );
// --- copy & substitute
public:
  void copy( const Int8_tSet& x ) {NS_GRIDDATA::Copy(*this,x,(int8_t) -1);}
  const Int8_tSet& operator = ( const Int8_tSet& x );

  void Extract(IntVector2D &ll, IntVector2D &ur,Int8_tSet &subgrid) const;
};


void Int8_tSet::Set()
{
  if(!set) {std::cerr<<" Memory not allocated. Call Set(x) first \n"; exit(1); }
  std::fill(set[0],set[0]+size.i*size.j,-1);
}

void Set にメモリを割り当てていることに気付きました。

4

5 に答える 5

5

NULL ポインターに初期化されたポインター 割り当てられたメモリー

それは次のような意味になると思います:

type* ptr = NULL;

この場合、メモリはポインタ自体(変数についてptr)に割り当てられます-つまり、sizeof(type*). ただし、割り当てられたメモリを指していないため、
必要delete ptr;ありません(ただし安全です)。

于 2013-09-04T07:14:35.090 に答える
1

NULL は「既知の無効な」値です。これはポインターの有効な値ですが、通常、null 値でポインターを逆参照することは安全ではありません (私が使用した古い HP コンパイラでは null を逆参照でき、常に "0" が返されました)。これを使用して、ポインターが有効かどうかを確認できます。

if (ptr == 0) // in C++ use 0 (or better still nullptr) rather than NULL, 
{
   ptr = malloc(...);
}
doSomethingWithPtr(ptr);
于 2013-09-04T07:04:34.093 に答える
0

為に、

      is a pointer initialized to a null pointer an allocated memory?

NULL ポインタは、変数が指すメモリ位置の "0" 番目を指すポインタです。たとえば、
int * var=NULL; とします。

0x104 |---------------------| ---| | | 0 | | | 0x100 |---------------------| | | ユーザー メモリ ara | . | | | | | | . | | ---| | | | | |---------------------| ---| | | | | | | |---------------------| | | OS メモリ領域 0x0 |---------------------| ---|

たとえば、変数としての「var」は、32 ビット マシンのメモリ アドレス 0x100 から 0x104 に格納されます。「var」の値の場所に 0 を格納し、*var として逆参照すると、OS メモリ領域に属する 0x0 の場所にアクセスすることになります。これはセグメントに違反しており、porocess は、特定の OS 呼び出しを除いて、すべての場合にユーザー空間のみにアクセスする必要があります。

したがって、NULL 初期化は、変数に格納された有効なアドレスではないことを意味します。ユーザーメモリ領域以外のメモリ領域には絶対にアクセスしないでください。

于 2013-09-04T07:37:41.753 に答える
0

NULLポインタが無効なアドレスを指している場合、つまり が使用されていないためにポインタが「何か」を指している場合を指定するために使用されます。
でポインタを初期化する習慣は、ポインタが初期化されていない状態にあるか、ポインタが指しているメモリが解放されてNULLいない状態にあるかを確認することです。 最後の理由は、ポインターが指すメモリを削除した後にポインターを設定するのが非常に良い習慣であるためです。たとえば、C ++では、ポインターが削除を行わないかどうかを最初に確認します。
NULLoperator deleteNULL

またNULL、ポインターが引数として使用される状況での標識としても使用されます (たとえば、無効な入力NULLを意味します)。

于 2013-09-04T07:19:56.267 に答える
0

もちろん違います。new、malloc、calloc ao を使用して手動でメモリを割り当てない限り、それ自体ではヒープにメモリを割り当てません。それを初期化することも同じカテゴリに分類されます。ポインターを削除したり、メモリの割り当てを解除したりしても、ポインターはまだ何かを指している場合があります。

{
    char *dp = NULL;
    /* ... */
    {
        char c;
        dp = &c;
    } /* c falls out of scope */
    /* dp is now a dangling pointer */
}

これはウィキペディアのダングリング ポインターの例です。

于 2013-09-04T07:18:14.687 に答える