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的使用场景:
- 程序不需要多个指向同一个对象的指针
- 为避免留下危险的悬挂指针的情况发生
unique_ptr<string> p1; // 类似这种场景,将一个临时的智能指针赋值给p1,并且临时的指针会很快被销毁,这样就会避免留下危险的悬挂指针 p1 = unique_ptr<string> (new string("hhhh"));
shared_ptr智能指针采用的策略:
创建智能更高的指针,跟踪引用特定对象的智能指针数。称为引用计数。例如,赋值时,计数将加1,而指针过期时,计数将减1。仅当最后一个指针过期时,才调用delete。
shared_ptr的使用场景:
- 程序要使用多个指向同一对象的指针:例如指针数组对象,需要使用一些辅助指针来标识特定的元素。