Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将指针设置为空是分配的内存吗?_C++_Pointers_Memory_Null_Allocation - Fatal编程技术网

C++ 将指针设置为空是分配的内存吗?

C++ 将指针设置为空是分配的内存吗?,c++,pointers,memory,null,allocation,C++,Pointers,Memory,Null,Allocation,我正在读一个初始化空指针的代码,起初我以为代码没有为指针分配新的内存来存储2d数组值(确实如此),这让我想知道,初始化为空指针的指针是分配的内存吗 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() { Free2D

我正在读一个初始化空指针的代码,起初我以为代码没有为指针分配新的内存来存储2d数组值(确实如此),这让我想知道,初始化为空指针的指针是分配的内存吗

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);
}
class Int8\u tSet:公共网格集
{
公众:
int8_t**集;
//
//
Int8_tSet():set(0){}
Int8_-tSet(const Int8_-tSet&x):集(0){copy(x);}
virtual~Int8_tSet(){Free2DArray(set);}
//
//---欧佩托
int8_t运算符()(IntVector2D x)常量{返回集[x.i][x.j];}
int8_t&operator()(IntVector2D x){返回集[x.i][x.j];}
//---功能
空集();
无效集(int8_t val);
void集(intvector2dx){NS_GRIDDATA::Set(x,*this,(int8_t)-1)}
void集(IntVector2D x,int8_t val){NS_GRIDDATA::Set(x,*this,val);}
无效开关();
//---输出和输入
无效输出(标准::ostream&out)常数;
无效输入(标准::istream&in);
//---复制和替换
公众:
void copy(const Int8_tSet&x){NS_GRIDDATA::copy(*this,x,(Int8_t)-1);}
const Int8_tSet&operator=(const Int8_tSet&x);
无效提取(IntVector2D&ll、IntVector2D&ur、Int8_tSet&subgrid)常量;
};
void Int8_tSet::Set()
{
如果(!set){std::cerrNULL是一个“已知无效”值。它是指针的有效值,但是用NULL值取消引用指针通常是不安全的(我使用的旧HP编译器允许您取消引用NULL,它总是返回“0”)。您可以使用它检查指针是否有效

if (ptr == 0) // in C++ use 0 (or better still nullptr) rather than NULL, 
{
   ptr = malloc(...);
}
doSomethingWithPtr(ptr);
NULL是一个“已知无效”值。它是指针的有效值,但使用NULL值取消引用指针通常是不安全的(我使用的旧HP编译器允许您取消引用NULL,它始终返回“0”)。您可以使用它检查指针是否有效

if (ptr == 0) // in C++ use 0 (or better still nullptr) rather than NULL, 
{
   ptr = malloc(...);
}
doSomethingWithPtr(ptr);
初始化为空指针的指针是否为已分配内存

我想这意味着:

type* ptr = NULL;
在这种情况下,为指针本身分配内存(关于变量
ptr
)-即
sizeof(type*)

它不指向已分配的内存,因此
删除ptr;
不是必需的(但仍然安全)

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

我想这意味着:

type* ptr = NULL;
在这种情况下,为指针本身分配内存(关于变量
ptr
)-即
sizeof(type*)


它不指向已分配的内存,因此
删除ptr;
不是必需的(但仍然安全)。

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

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

这是Wikipedia中的悬空指针示例。

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

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

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

NULL
用于指定指针何时指向无效地址,即指针何时指向“任何东西”,因为它未在使用。
使用
NULL
初始化指针的习惯是确保指针处于未初始化状态或指针指向的内存处于释放状态。
最后一个原因是,在删除了指向的内存后,将指针设置为 null 是非常好的习惯:例如,在C++中,<代码>操作符删除>代码>首先检查指针是否为代码> null < /代码>,以不做任何删除。
在指针用作参数的情况下,
NULL
也被用作哨兵(
NULL
例如表示无效输入)。
NULL
用于指定指针指向无效地址的时间,即指针指向“任何东西”的时间,因为指针未使用。
使用
NULL
初始化指针的习惯是确保指针处于未初始化状态或指针指向的内存处于释放状态。
最后一个原因是,在删除了指向的内存后,将指针设置为 null 是非常好的习惯:例如,在C++中,<代码>操作符删除>代码>首先检查指针是否为代码> null < /代码>,以不做任何删除。 在指针用作参数的情况下,
NULL
也被用作哨兵(
NULL
例如表示无效输入)。

空指针是指向变量所指向的内存中第0个位置的指针。 说,
int*var=NULL

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

将'var'作为变量存储在32位计算机的内存地址0x100到0x104中。如果将0存储在'var'的值位置,并将其解引用为*var,这将导致访问属于OS内存区域的0x0位置。这违反了段,Poroces在所有情况下都应仅访问用户空间,但某些OS调用除外

因此,NULL初始化表示变量中存储的地址无效。切勿访问除用户内存区以外的内存区。

对于

空指针是指向变量所指向的内存中第0个位置的指针。 说,
int*var=NULL

0x104|