this指针
1)this指针是指向对象自身的指针。 通常在class定义时要用到类型变量自身时,因为这时候还不知道变量名,就用this这样的指针来使用变量自身。
2)this 指针是一个隐含于每一个非静态成员函数中的特殊指针。
3)this 指针被隐含地声明为: ClassName *const this
,this指针是只能指向变量自身的常指针。
4)this 指针是个右值,所以不能取得 this 的地址(不能 &this)。
5)this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。
野指针和悬空指针
野指针 | 悬空指针 |
---|---|
未初始化的指针,其指针内容为一个随机值。 | 指针所指向的内容已被销毁,指针未置空 |
任何指针变量刚被创建时不会自动成为NULL指针,所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。 | 指针正常初始化,曾指向过一个正常的对象,但是对象销毁了,该指针未置空,就成了悬空指针。 |
它没有被正确的初始化于是指向一个随机的内存地址。存在野指针是一个严重的错误。 | 悬空指针存在并没有什么问题,除非你尝试通过这个指针访问指向的地址空间。 |
int main() {
int *p; // 指针未初始化,此时 p 为野指针
int *pi = nullptr;
{
int i = 6;
pi = &i; // 此时 pi 指向一个正常的地址
*pi = 8; // ok
}
*pi = 6; // 由于 pi 指向的变量 i 已经销毁,此时 pi 即成了悬空指针
return 0;
}
关于new失败
- new失败了会怎么样?抛异常bad_alloc,抛了异常就需要捕获。所以对new操作符的返回值进行判断是毫无意义的。
- 不让new抛异常怎么办?
int* p = new (std::nothrow) int; // 这样如果 new 失败了,就不会抛出异常,而是返回空指针
if ( p == 0 ) // 如此这般,这个判断就有意义了
return -1;