一般导致程序崩溃的最重要原因之一就是试图解引用NULL指针。正如上几篇文章中所说的,智能指针RefCountPtr和ScopedPtr提供了运行时的诊断。但是,并不是所有的指针都是拥有某个对象所有的智能指针。因此为了对试图解引用一个不具有对象所有权的指针的行为进行诊断,引入一种并不删除它所指向的对象的“半智能”指针。例如,如下代码示例:
template
class Ptr
{
public...
分类:
其他好文 时间:
2014-07-18 12:32:26
阅读次数:
246
现在我们讨论下使用返回指针的函数的潜在错误。假设有一个函数返回一个指向某个MyClass类型的对象的指针。
MyClass* MyFactoryClass::Create(const Inputs& inputs);
这个函数的一个非常显而易见的问题是,它的调用者是否负责删除这个对象?或者说这个指针所指向的MyClass类的实例是MyFactoryClass所拥有的实例?这个问题显然应该在声明...
分类:
其他好文 时间:
2014-07-16 13:26:51
阅读次数:
192
作用域指针
当我们并不打算复制智能指针,只是想保证被分配的资源将被正确地回收,可以采用一种简单得多的解决方案:作用域指针。如下示例代码:
template
class ScopedPtr
{
public:
explicit ScopedPtr(T* p = NULL)
:ptr_(p)
{
}
ScopedPtr& operator=(T* p)
{
if(ptr_ !...
分类:
其他好文 时间:
2014-07-16 11:45:30
阅读次数:
311
如前面内存泄露中所讲的,引用计数指针可以被复制。因此,一个智能指针的几份拷贝可以指向同一个对象。这就产生了由哪份拷贝负责删除它们共同指向的对象这个问题。答案是这组智能指针中最后消亡的那个将删除它所指向的对象。这类似于家居规则:“最后一个离开屋子的人负责关灯。”为了实现这个算法,这些指针共享一个计数器,记录有多少个智能指针引用同一个对象,即“引用计数”这个术语的由来。引用计数的应用范围很广:这个术语...
分类:
其他好文 时间:
2014-07-14 18:43:14
阅读次数:
284
动态数组
C++语言定义了另外一种new表达式语法,可以分配并初始化一个对象数组。标准库中包含
一个名为allocator的类,允许我们将分配和初始化分离。
12.2.1 new和数组
void fun1()
{
int *pia=new int[2]; //pia指向第一个int
//方括号中的大小必须是整型,但不必是常量
typedef int arrT[42...
分类:
编程语言 时间:
2014-07-10 19:39:17
阅读次数:
336
动态内存与智能指针(3)
/**
* 功能:动态内存与智能指针
* 时间:2014年7月8日15:33:58
* 作者:cutter_point
*/
#include
#include
#include
#include
using namespace std;
/**
智能指针和异常
*/
void f()
{
shared_ptr sp(new int(42)); ...
分类:
编程语言 时间:
2014-07-09 09:08:04
阅读次数:
161
weak_ptr是对对象的一种弱引用,它不会增加对象的引用计数。weak_ptr和shared_ptr之间可以相互转换,shared_ptr可以直接赋值给week_ptr,week_ptr可通过调用lock函数来获得shared_ptr(如果对象已经被释放,则返回一个空的shared_ptr)。
单纯使用shared_ptr有时会产生问题,考虑下面的代码:
1 class...
分类:
编程语言 时间:
2014-07-08 17:10:39
阅读次数:
289
这里先介绍auto_ptr的缺陷:
因为auto_ptr并不是完美无缺的,它的确很方便,但也有缺陷,在使用时要注意避免。首先,不要将auto_ptr对象作为STL容器的元素。C++标准明确禁止这样做,否则可能会碰到不可预见的结果
auto_ptr的另一个缺陷是将数组作为auto_ptr的参数: auto_ptr pstr (new char[12] ); //数组;为定义
然后释放资源...
分类:
编程语言 时间:
2014-07-08 14:38:50
阅读次数:
240
shared_ptr是一个引用计数智能指针,用于共享对象的所有权。它可以从一个裸指针、另一个shared_ptr、一个auto_ptr、或者一个weak_ptr构造。还可以传递第二个参数给shared_ptr的构造函数,它被称为删除器(deleter)。删除器用于处理共享资源的释放,这对于管理那些不是用new分配也不是用delete释放的资源时非常有用。shared_ptr被创建后,就可以像普通指...
分类:
编程语言 时间:
2014-07-08 13:26:57
阅读次数:
191