C++ 常考问题积累

文章讨论了浅拷贝和深拷贝问题导致的内存泄漏,并介绍了智能指针如unique_ptr和shared_ptr如何解决这一问题。unique_ptr保证对象的所有权唯一,防止双重删除,而shared_ptr通过引用计数管理多个指针共享同一对象的场景。
摘要由CSDN通过智能技术生成


1、浅拷贝与深拷贝问题:

2、智能指针问题:

void remodel(std::string& str)
{
	std::string* ps = new std::string(str);
    ...
    if(weired_thing())
        throw exception();
    
    str = *ps;
    delete ps;
    return str;
}

当程序出现异常时,delete将不被执行,分配到堆中的内存没有被回收,这就会导致内存泄漏。

引入智能指针:(auto_ptr, unique_ptr, shared_ptr)

智能指针是一个类,它可以在对象过期时,调用自身的析构函数删除指向的内存。

创建智能指针对象,包含头文件
#include<memory>

​ 智能指针只能将new获得的地址赋值给赋给这种对象。

unique_ptr比auto_ptr更安全:

所有权概念:对于指定的对象,只能有一个智能指针可拥有它,可以使用赋值操作转让所有权。防止两个智能指针的析构函数试图删除同一个对象。

unique_ptr<string> p3(new string("qweqwe"));
unique_ptr<string> p4;
p4 = p3;

上述程序防止了两个指针同时试图删除同一个对象的情况,p3指针不再指向有效的数据,但如果程序随后使用p1,则是件坏事。

在上面程序中,使用的是unique_ptr智能指针,编译器会报错,避免了留下危险的悬挂指针。但是如果使用aoto_ptr智能指针,则不会报错,存在潜在危险。(unique_ptr更安全,编译阶段错误比潜在的程序崩溃更安全)

推荐使用unique_ptr指针

unique_ptr的使用场景:

  1. 程序不需要多个指向同一个对象的指针
  2. 为避免留下危险的悬挂指针的情况发生
unique_ptr<string> p1;
// 类似这种场景,将一个临时的智能指针赋值给p1,并且临时的指针会很快被销毁,这样就会避免留下危险的悬挂指针
p1 = unique_ptr<string> (new string("hhhh"));

shared_ptr智能指针采用的策略:

创建智能更高的指针,跟踪引用特定对象的智能指针数。称为引用计数。例如,赋值时,计数将加1,而指针过期时,计数将减1。仅当最后一个指针过期时,才调用delete。

shared_ptr的使用场景:

  1. 程序要使用多个指向同一对象的指针:例如指针数组对象,需要使用一些辅助指针来标识特定的元素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值