什么是不同类别的指针?
- 有效指针:一个指向一个真正的对象在内存
- 无效指针:一个指向内存不是什么应该是。
- NULL pointer:一个指针,其值为0,因此不指向任何东西。
- 悬挂指针(有时也是野指针):一个指向已被删除/释放的内存。
- 智能指针:根本不是一个指针,而是一个像指针一样工作的对象,但为您管理内存。
尽管NULL常量的计算结果为零,但AFAIK NULL指针的值不需要为零(位模式可能因机器而异)。 – 2010-05-27 07:27:42
我可以将“Dangling”和“Invalid”分类为同一件事。实际上也是空的,但它的验证无效。 – 2010-05-27 07:28:04
但从逻辑上说,它们是不同的。如果你超出界限或者错误地将它分配到了错误的地址,那么指针就是无效的;如果你忘记它已经被释放了,它就会摇晃。 – 2010-05-27 07:32:23
...添加正交史蒂夫的答案 -
- 指针变量(
int*
,char*
,也void*
这是一个特殊的伪类型必须始终提领前投也。指向指针的指针。) - 指向函数的指针(
void(*)()
,int(*)(int)
)等。)
区别非常重要,因为一个家庭不能投入其他,反之亦然。
也有函数指针指向代码而不是对象。并指向成员,这需要一个类的实例来完全取消引用。指向成员函数的指向代码和要求的指针,以及一个类的实例来完全解引用。
还有几种不同类型的智能指针。这些用于包装动态内存分配,并跟踪底层数据的所有权。当没有人再拥有数据时,动态内存将自动释放。这里的三大重点是范围指针,共享指针和弱指针。作用域指针只有一个所有者,当它们超出作用域时,它们将被删除[参见C++中的std::auto_ptr
和C++ 0x中的std::unique_ptr
]。共享指针可以有很多所有者,并且直到所有所有者都完成它们之后,内存才会被释放。弱指针是这些形式中的一种,但它们并不总是保持严格的所有权;他们在需要时请求所有权,并且如果相应的共享指针已经用尽所有者,则该请求被拒绝。
指向成员的+1;) – 2010-05-27 07:46:59
指向成员的指针需要*实例*,而不是要取消引用的类。 – 2010-05-27 09:22:52
对不起,对,你是对的。 – 2010-05-27 09:27:36
你也可以根据自己的“不变性”添加分类和排序指针的另一个层面:
指向一个const - 你可以改变指针,但是不知道它指向。
例子:
int i = 42;
const int* pi = &i;
或
int i = 42;
int const* pi = &i;
常量指针 - 你不能改变什么指针指向。
例子:
int i = 42;
int* const pi = &i;
常量指针到一个const - 你不能改变什么指针指向,你不能改变指针本身。
例子:
int i = 42;
const int* const pi = &i;
你能澄清?什么类别?野指针不是一个标准术语。 – Naveen 2010-05-27 07:18:22
野指针是事实上的标准术语,意思是指向某个随机位置的未初始化的指针变量。有关其他类似条款,请询问Google。 – 2010-05-27 07:25:12
从来没有听说过野生指针,我一直在这样做了一段时间。 – 2010-05-27 07:39:02