前言
在C++中,指针是一个很常用的且复杂的变量类型,复杂是因为即便是熟悉C++的开发人员也会出现内存泄露,野指针等问题,今天就来记录一下什么是野指针。
概念
“野指针”不是NULL指针,是指向“垃圾”内存的指针。
概念可能看起来不太好理解,下面会将野指针的形成具体分为几种情况,分别说一下。
指针变量未初始化
通俗的讲,指针变量创建的时候并不会为NULL而是存在值的(这个值是随机的)。这个时候如果用NULL去判断则会返回false,这样非常危险!! 所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。如果没有初始化,编译器会报错“ ‘point’ may be uninitialized in the function ”
int main()
{
void* p;
// 此时的p指针会随机指向一个地址,p会打印出来一个随机地址
std::cout<< p <<endl;
}
指针释放后之后未置空
大家都知道,指针变量在使用完之后要手动释放,通常使用delete或者free,但这两个方法释放的是指针变量指向的地址上的内存,指针本身是不会释放的!!!,此时指针指向的就是“垃圾”内存。如果此时出现别的变量分配到此指针指向的“垃圾”内存,那将会非常危险!
因此delete和free后要及时给指针赋值NULL!!!
指针操作超越变量作用域
不要返回指向栈内存的指针或引用,因为栈内存在函数结束时会被释放。示例程序如下:
class A {
public:
void Func(void){ cout << “Func of class A” << endl; }
};
class B {
public:
A *p;
void Test(void)
{
A a;
p = &a; // 注意a的生命期 ,只在这个函数Test中,而不是整个class B
}
void Test1()
{
p->Func(); // p 是“野指针”
}
};
规避
简单地说就是:
初始化时置 NULL! 释放时置 NULL!
首先,我非常赞赏您对C++野指针问题的详细解释。您对野指针的定义和分类非常清晰,这对于初学者和有经验的开发人员来说都是非常有帮助的。您通过具体的示例阐述了野指针产生的原因,这有助于读者更好地理解这个概念。此外,您还提供了规避野指针问题的简单方法,避免了可能导致的内存泄漏或程序崩溃。
在这篇博客中,我觉得最大的亮点是您对野指针产生原因的分类和示例。这使得读者能够更清楚地了解野指针的本质,从而采取相应的措施避免它们。
尽管这篇博客的内容已经非常详尽,但我认为还有一些可以改进的地方。首先,您在博客中提到了“指针变量未初始化”这个问题,但在示例代码中,您没有给出如何正确初始化指针的示例。我建议您可以添加一个初始化指针的示例,以帮助读者更好地理解这个概念。例如:
其次,您在博客中提到了“指针释放后之后未置空”这个问题,但在示例代码中,您没有给出如何在释放指针后将其置空的示例。我建议您可以添加一个释放指针并将其置空的示例,以帮助读者更好地理解这个概念。例如:
最后,我建议您可以在博客中添加一些关于智能指针(如std::shared_ptr和std::unique_ptr)的内容。智能指针是C++11引入的一种自动管理内存的方法,可以有效地避免野指针和内存泄漏问题。通过介绍智能指针,您的博客将更加完整和实用。
总之,这篇博客是一篇非常好的关于C++野指针问题的文章。通过阅读这篇博客,读者可以更好地理解野指针的概念和产生原因,从而避免在实际编程中遇到这些问题。希望我的建议能对您的博客有所帮助,期待您的下一篇文章!