首页 > 试题广场 >

说一说什么是野指针,怎么产生的,如何避免

[问答题]

说一说什么是野指针,怎么产生的,如何避免

推荐

得分点

未知内存、未初始化、置为nullptr

参考答案

标准回答

  1. 什么是野指针

    野指针是指指向的位置是随机的、不可知的、不正确的。

  2. 野指针产生的原因

    a. 指针变量未初始化或者随便赋值:指针变量没有初始化,其值是随机的,也就是指针变量指向的是不确定的内存,如果对它解除引用,结果是不可知的。

    b. 指针释放后未置空:有时候指针在释放后没有复制为 nullptr,虽然指针变量指向的内存被释放掉了,但是指针变量中的值还在,这时指针变量就是指向一个未知的内存,如果对它解除引用,结果是不可知的。

    c. 指针操作超出了变量的作用域:函数中返回了局部变量的地址或者引用,因为局部变量出了作用域就释放了,这时候返回的地址指向的内存也是未知的。

  3. 如何避免野指针

    a. 指针变量一定要初始化,可以初始化为 nullptr,因为 nullptr 明确表示空指针,对 nullptr 操作也不会有问题。

    b. 释放后置为 nullptr。

延伸阅读

野指针产生的具体代码:

int * p;    // 未初始化,值未知
*p = 1000;    

int * p1 = (int *)0x1234;    // 指向的内存未知
*p1 = 2000;

int * p2 = new int(10);
delete p2;    // p2指向的内存释放了,但是p2指向的内存你未知
*p2 = 3000;
编辑于 2021-09-15 11:09:35 回复(0)

野指针是指一个指针变量指向未知或无效的内存地址,或者指向已经被释放的内存区域。使用野指针会导致程序崩溃或产生不可预测的行为,因为野指针指向的内存可能已经被其他程序或操作系统重用,从而导致数据被破坏或泄漏。

野指针通常是由以下原因产生的:

  1. 指针变量没有初始化。如果一个指针变量没有被初始化,它的值就是未知的,可能指向任何内存地址。
  2. 释放已经被释放的内存。如果在程序中释放了一块内存,但没有将指向该内存的指针设为NULL,那么这个指针就成了野指针。
  3. 指向栈上的变量。如果一个指针指向栈上的变量,在函数返回后,这个指针就成了野指针,因为它指向的内存已经被释放。

要避免野指针,可以采取以下措施:

  1. 初始化指针。在声明指针变量时,初始化为NULL或其他有效值,确保它不是一个野指针。
  2. 及时释放指针。在使用完指针指向的内存后,及时释放内存,并将指针设为NULL。
  3. 避免指向栈上的变量。如果必须指向栈上的变量,确保指针的作用域在变量作用域内,不要在变量作用域结束后继续使用指针。
  4. 使用动态内存分配。使用malloc或new分配内存时,确保及时释放内存,并将指针设为NULL。
  5. 尽量使用智能指针。智能指针可以在指针指向的内存不再需要时自动释放内存,并将指针设为NULL,从而避免野指针的出现。
发表于 2023-05-10 17:13:32 回复(0)
悬挂指针:当指针所指向的对象被释放,但是该指针没有任何改变,以⾄于其仍然指向已经被回收的内存地址,这种情况下该指针被称为悬挂指针;
野指针:未初始化的指针被称为野指针。
发表于 2022-09-14 17:48:15 回复(0)
释放内存时,指针没有及时置空.仍然指向该内存;野指针:指向位置不可知的指针.
发表于 2022-07-26 21:41:47 回复(0)
概念:野指针也就是指向位置不可知的指针
产生原因:释放内存后,指针没有及时置空,仍然指向该内存
发表于 2022-03-17 12:43:49 回复(0)