【发布时间】:2013-09-04 06:59:17
【问题描述】:
我正在阅读一个将指针初始化为 null 的代码,最初我认为该代码没有将新内存分配给用于存储二维值数组的指针(它确实如此),这让我想知道,是一个初始化为空指针分配的内存?
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中分配内存。
【问题讨论】:
-
你的问题很不清楚。发布一些代码并尝试指定您实际询问的内容。但是空指针不指向任何地方,所以它也不指向任何动态分配的内存。
-
@Angew 可悲的是,空指针指向某处,以寻址 0 :-) Linux 中存在一个基于 mmap(ping) 页面 0 上的某些内容并等待取消引用空值的漏洞。
-
@xanatos 好的,从实现的角度来看,它指向某个地方,它取决于硬件架构在哪里(它在 x86 上是 0,但这绝不是给定的)。但从语言的角度来看,它并没有指向任何地方。
-
如果您的问题是“它是动态分配的内存”,那么答案是否定的,除非指针本身是动态分配的。指针只是一个保存值的内置类型,就像
int或bool。bool是否设置为false是“分配的内存”?是和不是,取决于。 -
@Angew 对不起,我已经添加了我正在阅读的代码。
标签: c++ pointers memory null allocation