假设有一个如下的MyClass类:
class MyClass
{
public:
//构造函数
//拷贝构造函数
MyClass(const MyClass& that)
: int_data_(that.int_data_),
dbl_data_(that.dbl_data_),
str_data_(that.str_data_)
{
}
//赋值操作符
M...
分类:
其他好文 时间:
2014-07-19 23:46:08
阅读次数:
350
// 智能指针// 作用:// 1. 管理堆内存// 使用约束:// 1. 不能将智能指针对象赋值给智能指针对象// 2. 不能将栈对象取地址后赋值给智能指针// 3. 每一个对应的堆对象地址只能赋值给一个智能指针对象#pragma oncet...
分类:
其他好文 时间:
2014-07-19 17:05:40
阅读次数:
235
写在前面用自己的话解释清楚~智能指针是什么,可分为哪几种类型,各有什么特点,解决了什么问题,怎么解决的?什么是智能指针?智能指针是C++中的一个概念,主要是通过引用计数的方式,解决动态内存的自动释放问题(类似于Java、Python中的垃圾回收)。主要解决程序常见的两个问题:动态的申请的内存没有释放...
分类:
其他好文 时间:
2014-07-19 15:12:31
阅读次数:
352
测试环境:win7, vs2012如果未安装boost,请参考:http://blog.csdn.net/alex_my/article/details/17630685涉及智能指针:shared_ptr, weak_ptr, scoped_ptr, auto_ptr其它:enable_shared...
分类:
编程语言 时间:
2014-07-19 14:15:45
阅读次数:
276
一般导致程序崩溃的最重要原因之一就是试图解引用NULL指针。正如上几篇文章中所说的,智能指针RefCountPtr和ScopedPtr提供了运行时的诊断。但是,并不是所有的指针都是拥有某个对象所有的智能指针。因此为了对试图解引用一个不具有对象所有权的指针的行为进行诊断,引入一种并不删除它所指向的对象的“半智能”指针。例如,如下代码示例:
template
class Ptr
{
public...
分类:
其他好文 时间:
2014-07-18 12:32:26
阅读次数:
246
方法一:借助auto、decltype、unique_ptr、Lambda表达式构造 sqlite3 *db = NULL; auto deleter = [](sqlite3 *pdb){sqlite3_close(pdb);} int nRet = sqlite3_open16(L"F:\\my...
分类:
编程语言 时间:
2014-07-16 22:59:07
阅读次数:
385
现在我们讨论下使用返回指针的函数的潜在错误。假设有一个函数返回一个指向某个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