sstruct *temp1;
sstruct *p;
sstruct *temp2=new sstruct;
如果我尝试做这样的事情
temp1=p;
temp2=p;
有什么差异吗?
答案 0 :(得分:1)
首先,由于p
未初始化,因此通过读取它来调用未定义的行为(如果代码在函数范围内)。但是对于以下代码
sstruct *temp1;
sstruct *p = nullptr;
sstruct *temp2=new sstruct;
temp1=p;
temp2=p;
两个作业都没有区别(没有目的地)。 temp1
和temp2
保留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
值)。