关于值类型和引用类型的思考

来源:互联网 发布:网络购物的利弊 编辑:程序博客网 时间:2024/06/05 02:35

注:这里的引用类型是广义上的Referrence Type,类似于C#中关于引用类型的定义,包括C++中的引用和指针.更准确的说应该是堆内存指针.

 

已经习惯了C#和Java里的对象即对象指针,在写C++程序中总是面临困扰.

用引用类型?什么时候new而又什么时候delete?在堆内存分配空间比栈更耗时,用什么样的方案最合理呢?

用值类型?传值,以为着内存之间的频繁拷贝,频繁拷贝构造和析构,效率如何平衡?

 

首先是new和delete的问题.我尽量保证在同一个作用域开始时new,结束时delete.一个类中new出来的,在析构中全部delete.在方法中,在一个大括号结束时delete掉其中所有new出来的数据.这样貌似可以把问题最小化.但是在遇到面向接口编程,用父类表示子类时总是不能保证这个原则.对象是由某个工厂类生成的,给其他类调用.在什么时候delete最合适呢?目前我的做法是把工厂方法当做new来看待,在工厂制造对象所在作用域delete.又来一个问题,如果工厂是Singleton的呢?哈,我只有永不删除了,就把它当做是全局变量了,大不了在程序结束时delete

 

以前一直以为指针是很麻烦的东东,传值多简单~!现在发现某些情况下,传值比传指针面临更多的问题.首先是内存的频繁拷贝.不过如果占用空间不是很大的情况下还是可以接受的.毕竟现在计算机的速度非常快.然后就是拷贝构造和析构.弄不好问题就来了.有个例子,我在构造函数中LoadLibrary,在析构中FreeLibrary,在进行赋值操作时,左值和右值都已经构造过了,他们Load同一个Library,赋值时左值析构,右值内存拷贝到左值,此时,Library已经Free掉来,再进行操作都将出现问题.我的解决方案比较麻烦,就是用Flyweight模式,给每个Library一个计数,重复Load只增加计数,析构只减少计数,当计数为0时Free掉.