c++ - 指针和带分配内存的指针有什么区别?

标签 c++ pointers

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/

相关文章:

c++ - 如何获取 C++ 中抽象(?)pimpl 的调试信息?

C++ 如何将用户输入的字符串拆分为多个字符串

c++ - MSVS2013 - Neon intrinsics VTBL2 : different result in debug mode vs release mode. 我该如何解决这个问题?

c - 如何释放 TRIE?

C: 函数通过 void * 返回

c++ - 在具有引用字段的类上放置新的

c++ - 免费(): invalid pointer: in C++

c - 在取消引用之前为未初始化的指针赋值

使用指针和数组创建随机故事生成器来处理字符串

pointers - 复制包含指向 CUDA 设备的指针的结构