-
立即清空: 释放了指针指向的内存后,立即将该指针设置为
nullptr
(C++11引入的空指针字面量),这样就不会再指向之前的内存地址了。delete ptr; ptr = nullptr;
-
范围意识: 尽量使用局部变量来管理动态分配的内存,这样当控制流离开变量的作用域时,可以自动释放资源。智能指针(如
std::unique_ptr
和std::shared_ptr
)在C++中是自动管理动态内存的很好选择。 -
避免野指针: 声明指针时,如果不立即初始化,就需要给它赋予
nullptr
,确保它不会成为野指针,指向某个随机的、不确定的内存位置。int* ptr = nullptr; // 初始化为nullptr,而不是未初始化的野指针
-
适时销毁: 在对象的生命周期结束时(例如,在析构函数中),确保释放所有动态分配的内存。对于类的设计,要格外注意拷贝构造函数和赋值操作符的正确实现,避免复制和赋值导致的悬挂指针问题。
-
引用计数: 使用引用计数如
std::shared_ptr
智能指针,它通过内部机制确保只有最后一个指针持有者销毁时才释放内存。 -
定期检查: 使用代码审查、静态分析工具和运行时调试工具来检测和定位可能的悬挂指针。
-
函数返回值: 避免从函数返回局部变量的地址或者引用,因为函数返回后,局部变量的生命周期就结束了。
-
注意回调和事件处理: 如果你注册了指针为回调或事件处理器,确保在废弃指针之前注销这些回调或事件处理器。