指针和指针分配内存有什么区别?

时间:2016-10-14 20:33:03

标签: c++ pointers

sstruct *temp1;
sstruct *p;
sstruct *temp2=new sstruct;

如果我尝试做这样的事情

temp1=p;
temp2=p;

有什么差异吗?

2 个答案:

答案 0 :(得分:1)

首先,由于p未初始化,因此通过读取它来调用未定义的行为(如果代码在函数范围内)。但是对于以下代码

sstruct *temp1;
sstruct *p = nullptr;
sstruct *temp2=new sstruct;

temp1=p;
temp2=p;

两个作业都没有区别(没有目的地)。 temp1temp2保留nullptr值,之前为temp2分配的结构已被泄露。

答案 1 :(得分:1)

指针p未显式初始化。因此,如果这是一个局部变量,则它具有不确定值。如果,OTOH。,它在命名空间范围内,那么它是零初始化的。

假设它是一个不确定的值,后续赋值temp1=p具有未定义的行为。什么都可能发生。可能发生的这些事情包括(1)什么都没有,以及(2)崩溃。

如果没有任何反应,则第二个赋值temp2=p将丢失temp2的原始值,该值是指向动态分配的对象的指针。所以这就是内存泄漏。在未定义的行为之上。

在原始的Pascal指针中始终指向动态分配的对象。无法获取变量的地址。这是一个更高级别的指针视图,Pascal指针是单个对象指针,而不是指向数组的指针。

在C ++所基于的原始C中,指针更像是低级别的内存地址。可以通过在某个对象上使用地址运算符&来获取C或C ++指针值。或者你可以得到一个指针作为一个引用数组的表达式的隐式转换(然后你得到一个指向数组的第一个项目的指针)。

表示指针类型的null值有三个主要符号。

int* p = 0;              // Core language, original C.
int* p = nullptr;        // Core language, C++11 and later.
int* p = NULL;           // Library, `<stddef.h>`.

我建议使用较新的nullptr表示法。

它更具可读性,并且在与所谓的完美转发一起使用时效果更好(其主要缺点是它没有正确处理0,将其转发为int值)。