指针和分配了内存的指针有什么区别
What is the difference between pointers and pointers with allocated memory?
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;
这两个分配没有什么不同(没有目的地(。 temp1
和temp2
只剩下nullptr
值,并且您之前分配给temp2
的结构已泄露。
相关文章:
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 初始化或分配空字符串文字到指向 C 中的 char 的指针或指向 C++ 中 const char 的指针的原因是什么
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- 使用基类指针调用基类的值构造函数的语法是什么?
- 将指针分配给另一个指针时会发生什么情况?
- 当该数组的索引中没有元素时,指针指向什么?
- C++:Lambda 函数指针转换的用例是什么?
- C++关于指针和使用函数将它们启动到堆的行为究竟是什么?
- 这个失败的测试是将零添加到空指针未定义的行为、编译器错误还是其他什么?
- 使用共享指针时,从共享指针本身释放内存的机制是什么
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 什么更好?返回对象指针列表?或返回指向对象列表的指针?
- 什么是更好的做法?通过指针或标识符传递类成员?
- 如果我在 const 函数上使用指针,我可以返回什么?
- 为什么此指针值不能转换为整数的规则是什么?
- 在自定义 std::vector-like 容器中处理指针和非指针模板类型的最佳方法是什么?
- 在什么情况下,需要共享智能指针而无法使用唯一指针?
- 以下与指针相关的代码的输出是什么?
- 指向数组基址的指针而不是指向第一个元素的指针有什么优点?
- C++中的指针.什么类型的对象