sstruct *temp1;
sstruct *p;
sstruct *temp2=new sstruct;
如果我尝试做这样的事情
temp1=p;
temp2=p;
有什么不同吗?
最佳答案
指针p
未明确初始化。因此,如果这是一个局部变量,它就有一个不确定的值。如果,OTOH.,它在命名空间范围内,那么它是零初始化的。
假设它是一个不确定的值,后续赋值 temp1=p
具有未定义的行为。任何事情都可能发生。这些可能发生的事情包括 (1) 什么都没有,以及 (2) 崩溃。
如果没有任何反应,那么第二个赋值,temp2=p
,将失去 temp2
的原始值,它是指向动态分配对象的指针。所以这就是内存泄漏。在未定义行为之上。
在原始的 Pascal 中,指针总是指向动态分配的对象。没有办法获取变量的地址。这是指针的更高层次 View ,Pascal 指针是单个对象指针,而不是指向数组的指针。
在 C++ 所基于的原始 C 中,指针更像是低级内存地址。可以通过在某些对象上使用地址运算符 &
来获取 C 或 C++ 指针值。或者您可以获得一个指针作为引用数组的表达式的隐式转换(然后您将获得一个指向数组第一项的指针)。
指针类型的空值的表示法主要有3种。
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
值转发)。
关于c++ - 指针和带分配内存的指针有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40051554/