0

我正在阅读一个将指针初始化为空的代码,最初我认为代码没有为指针分配新内存以存储二维值数组(它确实如此),这让我想知道,是一个初始化为空指针的指针分配内存?

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

是初始化为空指针的指针 分配的内存

我想这意味着:

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

当然不是。除非你用new、malloc、calloc ao手动分配内存,否则它不会自己在堆上分配内存。初始化它属于同一类别。即使您已将其删除/释放内存,指针仍可能指向某些内容。

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

这是一个来自 Wikipedia 的悬空指针示例。

于 2013-09-04T07:18:14.687 回答
0

NULL用于指定指针何时指向无效地址,即指针何时指向“任何东西”,因为未使用。
初始化指针的习惯NULL是确保指针处于未初始化状态指针指向的内存已释放状态。最后一个原因是因为在删除指针指向的内存后
设置指针是一个很好的习惯:例如在C++中,首先检查指针是否不进行任何删除。NULLoperator deleteNULL

在将指针用作参数的情况下也NULL用作哨兵(例如,NULL表示无效输入)。

于 2013-09-04T07:19:56.267 回答
0

为了,

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

NULL指针是指向变量指向的内存位置中的“0”的指针。说,
int * var=NULL;

0x104 |----------| ---| | 0 | | 0x100 |---------------------| | 用户记忆ara | . | | | . | ---| | | |----------------------| ---| | | | |----------------------| | 操作系统内存区域 0x0 |---------------------| ---|

比如说,'var' 作为一个变量被存储在 32 位机器的内存地址 0x100 到 0x104 中。如果您将 0 存储在 'var' 的值位置并取消引用为 *var,这会导致访问属于 OS 内存区域的 0x0 位置。它违反了段,除某些操作系统调用外,进程在所有情况下都应该只访问用户空间。

因此,NULL 初始化意味着不是存储在变量中的有效地址。切勿访问用户存储区以外的存储区。

于 2013-09-04T07:37:41.753 回答