智能指针

1 智能指针的类别

(1)auto_ptr(c++98), 弃用
(2)unique_ptr、shared_ptr、weak_ptr
unique_ptr:独占式指针,同一时间内,只有一个指针能指向该对象
shared_ptr:共享式指针,多个指针指向同一对象,最后一个指针被销毁时,这个对象被释放。
weak_ptr:辅助shared_ptr。

2 shared_ptr

2. 1 工作原理

我们可以认为每个shared_ptr都有一个引用计数,无论何时我们拷贝一个shared_ptr,引用计数都会递增。当我们给shared_ptr赋予一个新值或是shared_ptr被销毁,引用计数就会递减,如果shared_ptr的引用计数变为0,它就会调用析构函数,自动释放自己所管理的对象。

auto r = make_shared<int>(42);//r指向的int只有一个引用者
r=q;//给r赋值,令它指向另一个地址
	//递增q指向的对象的引用计数
	//递减r原来指向的对象的引用计数
	//r原来指向的对象已没有引用者,会自动释放

shared_ptr指向的内存何时被释放?
(a)该shared_ptr被释放的时候。
(b)该shared_ptr指向其他对象。

2.2 使用

#include <iostream>
#include <memory>
using namespace std;

int main() {
    shared_ptr<int> p1(new int(10));  //定义一个shared_ptr指向值为100的对象
    cout << *p1 << endl;  //10

    shared_ptr<int> p2 = make_shared<int>(100);
    cout << *p2 << endl; //100

    shared_ptr<string> p3;
    p3 = make_shared<string>(3, 'a');
    cout << *p3 << endl; // aaa

    auto p4 = make_shared<float>(3.14);
    cout << *p4 << endl;  //3.14
    
    return 0;
}

2 unique_ptr

独占式指针,同一时间内,只有一个指针能指向该对象,当这个unique_ptr被销毁时,它指向的对象也被销毁。

2.1 使用

#include <iostream>
#include <memory>
using namespace std;

int main() {
    unique_ptr<int> p1;  //可以指向int对象的一个空智能指针

    unique_ptr<int> p2(new int(10)); //指向10的unique_ptr
    cout << *p2 << endl;  //10

    unique_ptr<string> p3 = make_unique<string>(3, 'a');
    cout << *p3 << endl;  //aaa

    auto p4 = make_unique<string>(2, 'b');
    cout << *p4 << endl;  //bb
}

不支持的操作:
(1)拷贝操作
(2)赋值操作

    unique_ptr<int> p1;  //可以指向int对象的一个空智能指针
    unique_ptr<int> p2(new int(10)); //指向10的unique_ptr
//    p1 = p2; //不支持赋值
//    unique_ptr<int> p3(p2); //不支持拷贝操作

支持的操作:
(1)移动

int main() {
    unique_ptr<string> p1(new string("aaa"));
    unique_ptr<string> p2 = move(p1); //移动完后,p1为空,p2指向原来p1所指内存
    cout << *p1 << endl;
    cout << *p2 << endl;
    return 1;
}

static的作用

c/c++共有
1):修饰全局变量时,表明一个全局变量只对定义在同一文件中的函数可见。
2):修饰局部变量时,表明该变量的值不会因为函数终止而丢失。
3):修饰函数时,表明该函数只在同一文件中调用。
c++独有:
4):修饰类的数据成员,表明对该类所有对象这个数据成员都只有一个实例。即该实例归 所有对象共有。
5):用static修饰不访问非静态数据成员的类成员函数。这意味着一个静态成员函数只能访问它的参数、类的静态数据成员和全局.

简述extern的作用,说明什么时候会使用extern?

extern 可以置于变量或者函数前,以表示这个变量或函数定义在别的文件中,提示编译器在遇到此变量或函数的时候在其他模块寻找其定义。

主要使用方式有两种:

1.如果函数的声明中带有extern,说明这个函数定义在其他文件中,这样的好处是可以取代include”*.h”,在一些复杂的项目中这样使用比较方便

2.C++在变异的时候为了解决函数的多态问题,会将函数名和参数联合起来生成一个函数中间名,而c语言则不会,因此会造成连接时找不到对应函数的情况。此时c函数就需要用extern“C”进行链接制定,这告诉编译器,请保持c语言原来的名称,不要生成用于链接的中间函数名。

atoi

int myatoi(const char *p)
{
	assert(p!=NULL);
	int res =0;
	bool negflag = false;
	while(*p==' ' || *p == '\t')
		p++;
	if('+' == *p || '-' == *p)
		negflag =(*p++ == '+');
	while(isdigit(*p))
		res = res*10 +  (*p++-'0');
 
	return negflag?(0-res):res;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值