在C++中,我们使用new
和delete
来动态分配和释放内存,使用malloc
和free
来动态分配和释放内存。但是,当我们使用delete
或free
释放内存后,指针会变成什么呢?本文将为您详细讲解。
delete
后指针怎么样了
当我们使用delete
释放内存后,指针会变成一个无效的指针,也就是说,指针所指向的内存已经被释放,不能再使用。如果我们继续使用这个指针,就会导致未定义的行为,可能会引发程序崩溃或其他问题。
以下是一个使用delete
释放内存后,指针变成无效指针的示例:
int *p = new int(10);
delete p;
cout << *p << endl; // 这里会引发未定义的行为
在上面的示例中,我们首先使用new
动态分配了一个int类型的内存,并将其赋值为10。然后我们使用delete
释放了这个内存。接着我们尝试输出指针p
所指向的内存,这里会引发未定义的行为,因为指针p
已经变成了一个无效指针。
free
后指针怎么样了
当我们使用free
释放内存后,指针会变成一个野指针,也就是说,指针所指向的内存已经被释放,但指针本身并没有被修改,仍然指向原来的内存地址。如果我们继续使用这个指针,就会导致未定义的行为,可能会引发程序崩溃或其他问题。
以下是一个使用free
释放内存后,指针变成野指针的示例:
int *p = (int*)malloc(sizeof(int));
*p = 10;
free(p);
cout << *p << endl; // 这里会引发未定义的行为
在上面的示例中,我们首先使用malloc
动态分配了一个int类型的内存,并将其赋值为10。然后我们使用free
释放了这个内存。接着我们尝试输出指针p
所指向的内存,这里会引发未定义的行为,因为指p
已经变成了一个野指针。
避免指针变成无效指针或野指针
为了避免指针变成无效指针或野指针,我们应该在释放内存后将指针赋值为nullptr
,这样可以避免继续使用这个指针。
以下是一个使用delete
释放内存后,将指针赋值为nullptr
的示例:
int *p = new int(10);
delete p;
p = nullptr;
cout << p << endl; // 输出nullptr
在上面的示例中,我们首先使用new
动态分配了一个int类型的内存,并将其赋值为10。然后我们使用delete
释放了这个内存。接着我们将指针p
赋值为nullptr
,这样可以避免继续使用这个指针。
以下是使用free
释放内存后,将指针赋值为nullptr
的示例:
int *p = (int*)malloc(sizeof(int));
*p = 10;
free(p);
p = nullptr;
cout << p << endl; // 输出nullptr
在上面的示例中,我们首先使用malloc
动态分配了一个int类型的内存,并将其赋值为10。然后我们使用free
释放了这个内存。接着我们将指针p
赋值为nullptr
,这样可以避免继续使用这个指针。
总结
在C++中,当我们使用delete
或free
释放内存后,指针会变成无效针或野指针。为了避免继续使用这个指针,我们应该在释放内存后将指针赋值为nullptr
。