将指针设置为空分配的内存?

时间:2013-09-04 06:59:18

标签: c++ pointers memory null allocation

我正在读取一个初始化指针为null的代码,最初我认为代码没有为指针存储新的内存来存储2d数组值(它确实如此),这让我很奇怪,是一个初始化为a的指针空指针是否已分配内存?

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中分配内存。

5 个答案:

答案 0 :(得分:4)

  

是一个初始化为空指针和已分配内存的指针

我想这意味着:

type* ptr = NULL;

在这种情况下,为指针本身(关于变量ptr)分配内存 - 即sizeof(type*)
它并不指向已分配的内存,因此delete ptr; NOT 是必需的(但仍然安全)。

答案 1 :(得分:1)

NULL是“已知无效”值。它是指针的有效值,但是取消引用具有空值的指针通常是不安全的(我使用的旧HP编译器允许您取消引用null并且它总是返回“0”)。您可以使用它来检查指针是否有效。

if (ptr == 0) // in C++ use 0 (or better still nullptr) rather than NULL, 
{
   ptr = malloc(...);
}
doSomethingWithPtr(ptr);

答案 2 :(得分:0)

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

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

这是来自维基百科的悬空指针示例。

答案 3 :(得分:0)

NULL用于指定指针指向无效地址的时间,即当指针指向“任何”因为未使用时。 使用NULL初始化指针的习惯是确保指针处于未初始化状态或指针所指向的内存中已释放状态。
最后一个原因是因为在删除指向的内存后将指针设置为NULL是一个非常好的习惯:例如,在C ++中,operator delete首先检查指针是否为NULL不做任何删除。

在指针用作argumments的情况下,NULL也被用作哨兵(NULL表示无效输入)。

答案 4 :(得分: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中。如果将0存储在'var'的值位置并将其解除引用为* var,这将导致访问属于OS存储区的0x0位置。它违反了段,在所有情况下,porocess都应该只访问用户空间,除了某些操作系统调用。

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