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

What is the difference between pointers and pointers with allocated memory?

本文关键字:指针 什么 区别 内存 分配      更新时间:2023-10-16
sstruct *temp1;
sstruct *p;
sstruct *temp2=new sstruct;

如果我尝试做这样的事情

temp1=p;
temp2=p;

有什么不同吗?

指针

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值转发(。

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

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

这两个分配没有什么不同(没有目的地(。 temp1temp2只剩下nullptr值,并且您之前分配给temp2的结构已泄露。

相关文章: