Lzp729@Blog
道法自然
Browse: Home / memory

memory

auto_ptr_ref类深入剖析

By lzp729 on September 8, 2009

STL之<memory>所遗留下来的问题, 即在auto_ptr的实现中, 多个构造函数和操作符的重载函数中都引入了auto_ptr_ref这个模板结构(template structure), 这里我就来探讨一下这样做的必要性和可行性.
首先回顾一下最基本的C++语言特性, 即在寻找可行函数列表时, 实参向形参做类型匹配的过程中, 存在从指针(*)到常量指针(const *)的隐式转换, 然而反向的隐式转换时不存在的, 要注意的是这的常量指针是指指针所指向的值是常量, 而指针自身并非常量(* const), 另外提一下, 指针(*)到(*const)之间的匹配属于精确匹配的范畴, 即存在他们之间的相互转换, 下面给出一组例子说明.

#include <cstdlib>
#include <iostream>
using namespace std;
void foo1(int *a) {}
void foo2(const int *a) {}
void foo3(int * const a){}
void foo4(const int * const a){}
 
int main(int argc, char*argv[])
{
int * a = 0;
const int * b = 0;
int * const c = 0;
const int [...]

Posted in inside VS C++ STL | Tagged auto_ptr, auto_ptr_ref, C++, memory, stl, vc | Leave a response

STL之<memory>

By lzp729 on September 7, 2009

STL设计的一个重要目的就是对C++的实用性进行增强, 而C++较之当前时髦的代码托管类的语言, 比如C#或者Java, 一个最为人所诟病的特性就是动态内存的分配策略. 这一特性, 使得程序员有足够的能力来控制内存的分配与回收, 但同时也为程序员的工作量增加了无谓的负担, 并增加了内存泄露的风险. 所以为了规避这一特性所造成的麻烦, STL设计了一个实用类auto_ptr, 其实auto_ptr这个模板类的作用就是对实际对象的指针进行了封装, 并通过C++的语言机制使得该类型的对象行为就像一个普通指针一样使用, 并且由于C++语言机制保证自定义类的对象在退出其生命周期的时候会自动调用其析构函数, 加上auto_ptr类的析构函数保证了对指针所指向对象的析构工作, 这样一来, 就从形式上免去了程序员手动回收内存的麻烦.
auto_ptr类设计了一组构造函数, 包括

explicit auto_ptr(_Ty *_Ptr = 0) _THROW0()
auto_ptr(auto_ptr<_Ty>& _Right) _THROW0()
auto_ptr(auto_ptr_ref<_Ty> _Right) _THROW0()
template<class _Other> auto_ptr(auto_ptr<_Other>& _Right) _THROW0()

我们知道具有单参数的且该参数有默认值的构造函数实际上就相当于无参数的默认构造函数, 而这样的构造函数实际上定义了参数类型到该类类型的一个转换途径, 而explicit关键字压制了这种自动转换行为, 使得程序员必须给出明显的构造句式来完成构造, 不能通过将一个普通指针赋值给auto_ptr类对象的方式来初始化.对于接下来的

auto_ptr(auto_ptr<_Ty>& _Right) _THROW0()
auto_ptr(auto_ptr_ref<_Ty> _Right) _THROW0()

他们合作定义了对copy contructor的完整支持, 甚至包括右值, 而其中涉及到的技术细节不属于本文的范围, 我将在另一文中阐述.
最后的模板copy constructor

template<class _Other> auto_ptr(auto_ptr<_Other>& _Right) _THROW0()

使得auto_ptr支持不同模板类型参数的auto_ptr实例之间的相互赋值初始化, 例如auto_ptr支持auto_ptr对象初始化auto_ptr对象, 但是实际上, 这样的语句仍然会导致编译报错, 原因就是本质上, 这样的初始化过程在实现上仍然是用int*来初始化float*, 而这样的初始化是被C++所禁止的, 所以就会报错, 其实, [...]

Posted in inside VS C++ STL | Tagged auto_ptr, C++, memory, stl, vc | 1 Response

memory

  • auto_ptr_ref类深入剖析
  • STL之<memory>

Copyright © 2012 Lzp729@Blog.

Powered by WordPress and Hybrid, Theme By Lzp729.

RSS feed Site Map