当前位置: 首页 > 文档资料 > C++大学教程 >

13.15 auto_ptr 类与动态内存分配

优质
小牛编辑
136浏览
2023-12-01

一个常见的编程习惯是在空闲存储区中动态分配内存(可能是对象),将该内存的地址赋给一个指针,使用这个指针操作内存,并在该内存不再需要时用delete释放内存。如果内存分配之后和执行delete语句之前发生异常,则可能发生内存泄漏。ANSI/ISO C++草案标准提供 <memory> 头文件中的auto_ptr类模板,可以解决这个问题。

auto_ptr 类对象维护动态分配内存的指针。当auto_ptr对象超出范围时,对指针数据成员进行一个 delete 操作。auto_ptr 类模板提供了+和->运算符.因此auto_ptr对象可以像普通指针变量一样使用。图13.7演示auto_ptr对象指向Integer类对象(在第8行到第18行定义)。

I // Fig. 13.7: fig13_07.cpp
2 // Demonstrating auto_ptr
3 #include <iostream>
4 #include <memory>
5
6 using namespace std;
7
8 class Integer {
9 public:
10 Integer( int i = 0 ) : value( i )
11 {cout << "Constructor for Integer " << value << endl; }
12 ~Integer()
13 {cout << "Destructor for Integer " << value << endl; }
14 void setInteger( int i ) { value = i; }
15 int getInteger() const { return value; }
16 private:
17 int value;
18 };
19
20 int main()
21 {
22 cout << "Creating an auto_ptr object that points "
23 << "to an Integer\n";
24
25 auto_ptr< Integer > ptrToInteger( new Integer( 7 ) );
26
27 cout << "using the auto_ptr to manipulate the Integer\n";
28 ptrToInteger->setInteger( 99 );
29 cout << "Integer after setInteger: "
30 << ( *ptrToInteger ).getInteger()
31 << "\nTerminating program" << endl;
32
33 return 0;
34 }

输出结果:

Creating an auto_ptr object that points to an Integer
Constructor for Integer 7
Using the auto_ptr to manipulate the Integer
Integer after setInteger: 99
Terminating program
Destruct for Integer 99

图 13.7 演示 auto_ptr

第 25 行:

auto_ptr<Integer> ptrToInteger(new Integer(7 ));

生成 aut_ptr 对象 ptrToInteger 并用动态分配 Inleger 对象的指针(包含数值7)初始化。

第28行:

ptrToInteger->setInteger(99);

用 auto_ptr 重载->运算符和函数调用运算符()调用 ptrToInteger 所指 Integer 对象的 setInteger 函数。

第30行:

(*ptrToInteger).getInteger()

用 auto_ptr 重载 * 运算符复引用 ptrToInteger,然后用圆点运算符和函数调用运算符 () 调用 ptrTolmeger 所指 Integer 对象的 getInteger 函数。
由于 ptrToInteger 是 main 中的局部自动变量,因此main终止时删除 ptrToInteger。这样就强制删除 ptrToInteger 所指的 Integer 对象,从而强制调用 Integer 类的析构函数。更重要的是这个方法可以防止内存泄漏。