如何避免野指针?

1、初始化指针:在定义指针时,一定要给它赋一个有效的初始值,或者将其设置为 NULL(或 nullptr),以确保指针不指向未知内存地址。

2、避免悬挂指针:指针指向的内存地址被释放后,指针就成了悬挂指针,访问悬挂指针会导致程序崩溃或产生不可预测的结果。为了避免悬挂指针,应该在释放指针所指向的内存之后,将指针设置为 NULL(或 nullptr):

int* p = new int;
*p = 10;
delete p;
p = NULL; // 或者 p = nullptr;

 3、避免指针越界:访问指针越界会导致程序崩溃或产生不可预测的结果。为了避免指针越界,应该始终确保指针指向的内存地址是有效的,并且不要超出其分配的内存范围。例如:
 

int* p = new int[10];
for (int i = 0; i < 10; i++) {
    p[i] = i;
}
delete[] p;
p = NULL; // 或者 p = nullptr;

4、使用智能指针:智能指针是一个封装了指针的对象,它可以自动管理指针的生命周期,避免了手动释放指针的问题。使用智能指针可以避免野指针和悬挂指针等问题。 
 

#include 

std::unique_ptr p(new int); // 声明一个 unique_ptr 智能指针
*p = 10; // 操作智能指针就像操作原始指针一样

关于三种智能指针分别在什么情况下使用?

  1. unique_ptr 具有独占所有权,即同一时刻只能有一个 unique_ptr 指向该内存块,当一个 unique_ptr 被销毁或转移给其他 unique_ptr 时,它所管理的内存块也随之销毁或转移。因此,unique_ptr 不能被拷贝,只能被移动。如果你需要一个独占所有权的指针,那么使用 unique_ptr,因为它可以确保同一时间只有一个指针指向所管理的对象,可以避免悬空指针和内存泄漏的问题。

  2. shared_ptr 具有共享所有权,即可以有多个 shared_ptr 同时指向该内存块,当所有 shared_ptr 都被销毁时,该内存块才会被释放shared_ptr 内部维护了一个引用计数器,用于记录指向该内存块的 shared_ptr 的数量,每次拷贝一个 shared_ptr 时,该计数器会自增。当 shared_ptr销毁时,该计数器会自减,当计数器减为 0 时,内存块才会被销毁。如果你需要多个指针共享同一个对象,那么使用 shared_ptr,因为它可以实现引用计数,确保所管理的对象在没有任何指针引用时被销毁,同时避免出现悬空指针的问题。

  3. auto_ptr 也具有独占所有权,但它的转移方式与 unique_ptr 不同,它在被拷贝时,会将其管理的内存块的所有权转移给拷贝目标,而将自身置空,这样可以避免出现悬空指针的问题。因此,auto_ptr 可以被拷贝,但每次拷贝后,源指针都会被置空。
    如果你需要在传递指针时转移所有权,那么使用 auto_ptr,因为它可以将所有权转移给拷贝目标,避免了悬空指针的问题。但是需要注意的是,auto_ptr 已经被 C++11 废弃,应该使用 unique_ptr 来替代它。

你可能感兴趣的:(算法,c++,开发语言)