首先定义一个学生类:
#pragma once
#include <string>
class Student {
public:
Student(std::string name,int age,int math);
~Student();
private:
int _age;
std::string _name;
int _math;
};
#include "Student.h"
Student::Student(std::string name, int age, int math)
:_name(name),_age(age),_math(math) {
}
Student::~Student() {
}
void testPtr() {
Student* std1 = new Student("aaa", 15, 98);
}
当主函数调用完成这个函数的时候,大家就会发下一个问题,那就是已经分配内存的std1内有被释放掉,从而造成了内存泄露。这是C++不是java,java本身就会有内存清理机制,在内存不再使用的时候,自动的释放掉。
也许你会说,C++中不使用这个对象指针的时候,我在调用一次delete不就行了。
当然可以了,但是不要忘了,这段代码很短也很清楚,当项目比较大的时候,往往就会忘记去释放掉被分配的内存了。
为了不造成内存泄露,就引入的智能指针,智能指针在结束期生命期的同时,也会释放掉其指向的内存,不会造成内存泄露。
把上面的代码修改一下:
void testPtr() {
std::auto_ptr<Student> stu2(new Student("aaa", 15, 98));
}
当这个函数运行结束之后,就会自动调用delete,调用其析构函数,从而释放掉被分配的内存。
或者修改成:
void testPtr() {
Student* std1 = new Student("aaa", 15, 98);
std::auto_ptr<Student> ptr = std::auto_ptr<Student> (std1);
}
unique_ptr和auto_ptr区别:
std::auto_ptr<Student> stu2(new Student("aaa", 15, 98));
std::auto_ptr<Student> stu3;
stu3 = stu2;
上面语句执行以后,stu3就接管了stu2的所有权,stu2的所有权被剥夺。当后面的程序再次使用stu2时,就会出现问题,因为stu2不再指向有效的数据。以上只有在运行的时候才会出现问题。
std::unique_ptr<Student> stu4(new Student("aaa", 15, 98));
std::unique_ptr<Student> stu5;
stu5 = stu4;
使用unique_ptr在编译的时候就出现了错误提示,所以unique_ptr比auto_ptr也就更安全。
注意:
1.使用new分配内存的时候,才能使用auto_ptr和unique_ptr;当时使用new[ ]分配内存的时候,则不能使用他们;
2.若没有通过使用new来分配内存,则不能使用auto_ptr和unique_ptr;
3.不使用new或者new [ ]分配内存时,不能使用unique_ptr;
4.如果使用多个指向同一个对象的指针,应选择share_ptr;
aaa