`
peng2251
  • 浏览: 12625 次
  • 性别: Icon_minigender_1
  • 来自: 国内
最近访客 更多访客>>
社区版块
存档分类
最新评论

再次理解指针和引用

 
阅读更多
一、先看一段代码:
 
#include <iostream>
using namespace std;
void freePtr1(int* p1)
{
   delete p1;
   p1 = NULL;
}
void freePtr2(int*& p2)
{
   delete p2;
   p2 = NULL;
}
 
void main()
{
   int *p1 = new int;
   *p1 = 1;
   freePtr1(p1);
   int *p2 = new int;
   *p2 = 2;
   freePtr2(p2);
   system("pause");
}
思考:在freePtr1freePtr2 的比较中,你能发现它们的不同点吗?
 
二、对代码进行解释:
#include <iostream>
using namespace std;
void freePtr1(int* p1)
{
   //未释放内存前 -> p1 Address : 0012FDDC p1 value : 003429B8,在这里,p1它也是一个变量,既然是一个变量,那么它将会以值的传递,把外部变量p1传到栈内,在栈内产生一个地址:0012FDDC,当然,它的值不会变仍然是指向堆地址:003429B8
   delete p1; //系统回收p1值的地址003429B8处的内存。
p1 = NULL;//p1赋以NULL值即:00000000,注意:p1本身的地址并没有变,变的是p1的值。
   //释放内存后 -> p1 Address : 0012FDDC p1 value : 00000000,出栈后,p1由于是一个临时对象,出栈后它会自动被视为无效。
}
void freePtr2(int*& p2)
{
   //未释放内存前 -> p2 Address : 0012FEC8 p2 value : 003429B8p2是一个指针的引用,即引用指向指针,记住引用的特点:对引用的对象直接操作。所以它的地址和值与栈外的main()函数中,p2的值是同一个。
   delete p2; //p2所引用的指针进行释放内存,即:系统回收main()函数中 p2的值 003429B8 地址处的内存。
   p2 = NULL;//main()函数中p2的指针赋以NULL值。
   //释放内存后 -> p2 Address : 0012FEC8 p2 value : 00000000,由于操作的对象都是main()函数中的p2,所以它将应用到原变量中。
}
 
void main()
{
   int *p1 = new int;
//释放内存前-> p1 Address : 0012FED4 p1 value : 003429B8
   freePtr1(p1);
   //释放内存后-> p1 Address : 0012FED4 p1 value : 003429B8
 
   int *p2 = new int;
   //释放内存前-> p2 Address : 0012FEC8 p2 value : 003429B8
   freePtr2(p2);
   //释放内存后-> p2 Address : 0012FEC8 p2 value : 00000000
   system("pause");
}
分享到:
评论

相关推荐

    C++智能指针实现(包含拷贝构造,赋值函数,引用解引用重载)

    然后,将`ptr`和`ref_count`设置为其他智能指针的值,并再次递增`ref_count`。 解引用操作符`*`和引用操作符`-&gt;`允许我们像操作普通指针一样使用智能指针,提供了便利的语法糖。 最后,析构函数在智能指针生命周期...

    智能指针错误用法demo

    但如果在智能指针作用域内提前手动释放资源(例如,调用`delete`),则智能指针在析构时会再次尝试释放,造成双释放错误。 5. **循环引用问题**: 当两个或多个`std::shared_ptr`相互引用时,它们的引用计数不会降...

    C指针宝典

    通过理解指针的概念、类型、指向的类型、值和本身占据的内存区,以及熟练掌握指针的算术运算,可以更有效地使用C语言进行编程。同时,警惕并避免指针使用中的常见错误,是每个C程序员的必修课。通过不断实践和学习,...

    C语言指针及常见错误

    理解指针的基本概念是学习C语言的关键之一。指针不仅可以用来访问内存中的数据,还可以帮助程序员更加高效地管理内存资源。 1. **指针的定义**:指针是存储其他变量地址的一种特殊变量。例如,如果有一个整型变量`...

    数据结构 C++ 指针2

    4. **指针的类型.cpp**:文件可能会涵盖指针的声明和使用,包括void指针(可以存储任何类型对象的地址)、const指针(不能修改所指的对象)以及指针的解引用和类型转换。 5. **指针变量的下标元素.cpp**:通过指针...

    指针数组解析

    另外,释放指针后,应避免再次使用该指针,否则可能导致空悬指针引用。内存泄漏是程序错误的常见原因,它发生在分配的内存没有被正确释放。最后,重复释放同一块内存也是危险的,可能导致难以察觉的运行时错误。 ...

    再再论指针

    C语言中的声明是理解指针和数组的关键。 **基本语法**: - `类型标识符 *指针名称;` —— 定义一个指向某种类型数据的指针。 - `类型标识符 (名称[N]);` —— 定义一个包含 `N` 个元素的数组。 **复杂声明**: -...

    C++指针的简单例子

    在C++编程语言中,指针是一个至关重要的概念,它被用来存储内存地址,从而能够直接操作内存中的数据。在本例中,我们将探讨如何...通过简单的例子,我们可以逐步理解指针的工作原理,并将其应用到更复杂的编程场景中。

    指针操作符

    如果`point`是一个定义了重载`operator-&gt;`的类的对象,那么`point-&gt;action`会先调用`point`的`operator-&gt;()`,然后对返回的结果再次应用这个过程,直到找到`action`成员或者返回一个指针,这个指针指向包含`action`...

    C++指针应用的四大误区

    ### C++指针应用的四大误区 #### 一、引言 ...为了避免这些常见的误区,开发者需要深入理解指针的工作原理,并遵循最佳实践。通过仔细检查代码、使用智能指针等现代C++特性,可以有效地减少这些问题的发生。

    c++ 二级指针与二维数组之间值操作

    首先,使用`*`运算符解引用到一级指针,然后再次解引用到实际的字符。例如,访问`arr[0][0]`的代码可能是`*(ptr[0])`或`(*ptr)[0]`。 4. **赋值操作**: 通过二级指针对二维数组的元素赋值,我们可以直接修改数组...

    C_C++指针经验总结

    理解指针的关键在于掌握以下四个方面: 1. **指针的类型**:指针本身的类型指的是指针本身能够存储的地址的类型。例如,如果声明了一个`int *ptr;`,那么`ptr`的类型就是`int *`。 2. **指针所指向的类型**:指针...

    c++指针与递归的详细剖析

    最后,结合提供的文档标题,我们期待在"递归(含代码执行过程解释).doc"和"(重要)函数指针(含代码执行过程解释).doc"中找到更具体的实例和详细的代码执行流程,以便深入理解和应用这些概念。 总的来说,理解和...

    C++ 智能指针实现

    通过理解智能指针的工作原理和选择合适的智能指针库,开发者可以有效地避免内存管理相关的错误,提高软件的质量和性能。然而,智能指针并非万能,正确地应用和理解其限制对于开发高质量的C++程序至关重要。

    C语言函数指针与指针函数训练.zip

    通过深入学习和实践C语言的函数指针和指针函数,不仅可以提升编程技巧,还能更好地理解和运用C语言的底层机制。这将对你的编程事业大有裨益,特别是在需要高效和低级操作的场合,如系统编程、游戏开发或者嵌入式系统...

    C语言指针资料

    不过,指针的使用也伴随着风险,如空指针引用、悬空指针和内存泄漏等问题。因此,理解并熟练掌握指针的使用是成为一名合格的C程序员的必经之路。这个压缩包里的文档很可能包含了指针的基本概念、高级用法、常见陷阱...

    使用指针易犯的错误.

    掌握指针的艺术需要时间和实践,理解指针的工作原理、内存管理以及如何有效地使用它们是成为熟练C++程序员的关键。通过谨慎管理和正确使用指针,可以避免上述问题,编写出更安全、更高效的代码。

    指针指针指针(彻底的搞定)

    指针在C语言中广泛应用于动态内存分配、数组、字符串操作、函数参数传递等方面,是理解和编写高效C程序的关键。通过熟练掌握指针,你可以更好地控制程序的内存管理和数据处理,从而实现更复杂的功能。在后续学习中,...

Global site tag (gtag.js) - Google Analytics