C++ 智能指针

首先定义一个学生类:

#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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wb175208

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值