析构函数

C#-概念-类:类

北慕城南 提交于 2019-12-27 10:41:48
ylbtech-C#-概念-类:类 类(Class)是 面向对象程序设计 (OOP,Object-Oriented Programming) 实现信息封装的基础 。类是一种 用户定义类型 ,也称 类类型 。每个类包含数据说明和一组操作数据或传递消息的函数。 类的实例称为对象 。 1. 返回顶部 1、 中文名:类 外文名:Class 类 别:一种数据类型 本 质:类型 目录 1 介绍 2 用法 3 特性 4 示例 2、 2. 返回顶部 1、 介绍 一个简单的类图 类是 面向对象程序设计 中的概念,是 面向对象编程 的基础。 类的实质是一种数据类型 ,类似于 int 、char等基本类型, 不同的是它是一种复杂的数据类型 。 因为它的本质是类型,而不是数据,所以不存在于内存中,不能被直接操作,只有被实例化为对象时,才会变得可操作 。 类是对现实生活中一类具有共同特征的事物的抽象 。如果 一个程序里提供的类型与应用中的概念有直接的对应,这个程序就会更容易理解,也更容易修改 。一组经过很好选择的用户定义的类会使程序更简洁。此外,它还能使各种形式的代码分析更容易进行。特别地,它还会使 编译器 有可能检查对象的非法使用。 类的内部 封装 了方法,用于操作自身的成员。 类是对某种对象的定义,具有行为(be-havior),它描述一个对象能够做什么以及做的方法(method)

Finalize() 和 Dispose()

六月ゝ 毕业季﹏ 提交于 2019-12-27 10:18:46
引用: http://www.7dspace.com/doc/24/0603/20063604160336160.htm http://www.yesky.com/20030311/1656401_1.shtml MSDN垃圾回收专题: http://msdn2.microsoft.com/zh-cn/library/0xy59wtx.aspx 一般在.NET程序中创建的托管对象,都是可以依靠GC来自动回收;但是当对象中封装了非托管资源时,就需要自己来释放。 对非托管资源的释放,可以通过Finalize()方法和IDisposable接口的Dispose()方法来实现。 Finalize() * 析构函数会在编译时会被翻译为protected void Finalize(),这是C#的析构函数的语法 GC在回收对象之前会调用Finalize()来实现非托管资源的释放,不过按照MSDN的说法,Finalize()会导致性能的降低。 “垃圾回收器使用名为“终止队列”的内部结构跟踪具有 Finalize 方法的对象。每次您的应用程序创建具有 Finalize 方法的对象时,垃圾回收器都在终止队列中放置一个指向该对象的项。托管堆中所有需要在垃圾回收器回收其内存之前调用它们的终止代码的对象都在终止队列中含有项。   实现 Finalize 方法或析构函数对性能可能会有负面影响

auto_ptr浅析

∥☆過路亽.° 提交于 2019-12-27 07:39:08
auto_ptr是C++标准库中(<utility>)为了解决资源泄漏的问题提供的一个智能指针类模板(注意:这只是一种简单的智能指针) auto_ptr的实现原理其实就是RAII,在构造的时候获取资源,在析构的时候释放资源,并进行相关指针操作的重载,使用起来就像普通的指针。 std::auto_ptr<ClassA> pa(new ClassA); 下面主要分析一下auto_ptr的几个要注意的地方: 1,Transfer of Ownership auto_ptr与boost库中的share_ptr不同的,auto_ptr没有考虑引用计数,因此一个对象只能由一个auto_ptr所拥有,在给其他auto_ptr赋值的时候,会转移这种拥有关系。 #include <utility> #include <iostream> using namespace std; class A { public: A() { id = ++count; cout << "create A" << id << "\n"; } ~A() { cout << "destroy A" << id << "\n"; } private: static int count; int id; }; int A::count = 0; /*调用该函数会丢失掉所有权*/ void sink(auto_ptr<A> a

c++理解析构函数

瘦欲@ 提交于 2019-12-27 02:22:09
析构函数有2种方式调用,一个是主动调用delete,另一个是根据RAII的规则,在对象的生命周期结束时自动析构。第一点没什么好说的,就简单讲下第二点。 对象的生命周期不等于是程序的生命周期,一般我们所谓的生命周期就是一个作用域,当变量或者对象离开这个作用域时就会自动析构。一般一对{}就是一个作用域,举个例子 int main() { for(int i=0; i<10; i++) { A a; } a//错误,脱离作用域 } 一般在函数里的对象,离开函数时才算离开作用域,即return发生时,才执行析构,所以main中定义的对象不是在你说的return 0;之前执行的。return是一个离开的标志,只有遇到了该标志,才会开始离开。for结束后,就无法使用a了,因为该对象的生命周期已结束。 全局对象的话,是在程序结束时才执行析构,即遇到main中的return时,任何程序都是从main开始,到main结束的。 如果是new的对象,即使离开了作用域也会一直存在,必须主动delete,否则只有在结束程序时才会执行析构。这里在说下内存泄漏,举个例子 void fun() { A *a = new A(); } int main() { while(1) { fun(); } reutn0; } 当离开fun时,虽然离开了作用域,但用new动态开辟空间的对象是不会析构的,你可以观察任务管理器

C++内联函数与宏定义

一曲冷凌霜 提交于 2019-12-26 06:12:40
用内联取代宏: 1.内联可调试; 2.可进行类型安全检查或自动类型转换; 3.可访问成员变量。 另外,定义在类声明中的成员函数自动转化为内联函数。 文章(一) 内联函数与宏定义   在C中,常用预处理语句#define来代替一个函数定义。例如:     #define MAX(a,b) ((a)>(b)?(a):(b))   该语句使得程序中每个出现MAX(a,b)函数调用的地方都被宏定义中后面的表达式((a)>(b)?(a):(b))所替换。   宏定义语句的书写格式有过分的讲究, MAX与括号之间不能有空格,所有的参数都要   放在括号里。尽管如此,它还是有麻烦:     int a=1,b=0;     MAX(a++,b); //a被增值2次     MAX(a++,b+10); //a被增值1次     MAX(a,"Hello"); //错误地比较int和字符串,没有参数类型检查     MAX( )函数的求值会由于两个参数值的大小不同而产生不同的副作用。     MAX(a++,b)的值为2,同时a的值为3;     MAX(a++,b+10)的值为10,同时a的值为2。   如果是普通函数,则MAX(a,"HellO")会受到函数调用的检查,但此处不会因为两个参数类型不同而被编译拒之门外。幸运的是,通过一个内联函数可以得到所有宏的替换效能和

究竟是什么毁了我的impl实现

旧街凉风 提交于 2019-12-25 18:31:53
Impl模式早就有过接触(本文特指通过指针完成impl),我晓得它具有以下优点: 减少头文件暴露出来的非必要内部类(提供静态库,动态库时尤其重要); 减小文件间的编译依存关系,大型代码库的编译时间就不会那么折磨人了。 Impl会带来性能的损耗,每次访问都因为指针增加了间接性,还有一个微小的指针内存消耗。但是基于以上优点,除非你十分确定它造成了性能损耗,否则就让它存在吧。 Qt中大量使用Impl,具体可见https://wiki.qt.io/D-Pointer中关于Q_D和Q_Q宏的解释。 然而,如何使用智能指针,我是说基于std::unique_ptr实现正确的impl模式,就有点意思了。 错误做法 #include <boost/noncopyable.hpp> #include <memory> class Trace1 : public boost::noncopyable { public: Trace1(); ~Trace1() = default; void test(); private: class TraceImpl; std::unique_ptr<TraceImpl> _impl; }; 这是我初版代码,关于_impl的实现细节,存放于cpp中,如下所示: class Trace1::TraceImpl { public: TraceImpl() =

C#内存管理和垃圾回收机制

淺唱寂寞╮ 提交于 2019-12-25 11:03:38
数据类型 垃圾回收机制 一、数据类型 C#中的数据类型分为 值类型 (Value type) 和 引用类型(reference type) , 值 类 型: 所有的值类型都集成自 System.ValueType 上,除非加声明?否则不可为null,保存在 堆栈( Stack,先进后出 ) 上,常见的值类型有:整形、浮点型、bool、枚举等。 引用类型: 所有的引用类型都继承自System.Object 上,引用类型保存在 托管堆(Head,先进先出) 上,常见的类型有:数组、字符串、接口、委托、object等。 拆箱和装箱:引用类型和值类型的相互转换叫做拆装箱操作。 拆箱: 拆箱就是将一个引用型对象转换成任意值型!比如: int i=0; System.Object obj=i; int j=(int)obj; 装箱: 装箱就是隐式的将一个值型转换为引用型对象。比如: int i=0; Syste.Object obj=i; 二、垃圾回收机制 GC   1、简介 C#中和Java一样是一种系统自动回收释放资源的语言,在C#环境中通过 GC(Garbage Collect)进行系统资源回收,在数据基本类型中介绍到,C#数据类型分为引用类型和值类型, 值类型保存在Stack上,随着函数的执行作用域执行完毕而自动出栈,所以这一类型的资源不是GC所关心 对象

浅谈CLR的内存分配和回收机制

不想你离开。 提交于 2019-12-25 11:03:22
相对于C++程序员来说,C#程序员是非常幸运的,至少我们不需要为内存泄漏(Memory Leak)而头疼,不需要负责内存的分配和回收。但这不意味着我们只需要知道new的语法就可以了,作为一个严肃的C#程序员,我们应该对此有所了解,有助于我们编写性能更好的代码。 主要内容: CLR的内存分配机制 CLR的回收机制 一、CLR的内存分配机制 .NET Framework 的垃圾回收器管理应用程序的内存分配和释放。每次使用 new 运算符创建对象时,运行库都从托管堆为该对象分配内存。只要托管堆中有地址空间可用,运行库就会继续为新对象分配空间。 ... object obj = new object(); ... 但是,内存不是无限大的。 public void FillMemory() { ArrayList memory = new ArrayList(); // 输出填充前所占内存大小 Console.WriteLine("used memory:" + GC.GetTotalMemory(false)); for (int i = 0; i < 100000; i++) { memory.Add(new object()); } // 输出填充后所占的内存大小 Console.WriteLine("used memory:" + GC.GetTotalMemory(false));

从C#垃圾回收(GC)机制中挖掘性能优化方案

戏子无情 提交于 2019-12-25 11:03:00
  GC,Garbage Collect,中文意思就是垃圾回收,指的是系统中的内存的分配和回收管理。其对系统性能的影响是不可小觑的。今天就来说一下关于GC优化的东西,这里并不着重说概念和理论,主要说一些实用的东西。关于概念和理论这里只做简单说明,具体的大家可以看微软官方文档。 一、什么是GC   GC如其名,就是垃圾收集,当然这里仅就内存而言。Garbage Collector(垃圾收集器,在不至于混淆的情况下也成为GC)以应用程序的root为基础,遍历应用程序在Heap上动态分配的所有对象[2],通过识别它们是否被引用来确定哪些对象是已经死亡的、哪些仍需要被使用。已经不再被应用程序的root或者别的对象所引用的对象就是已经死亡的对象,即所谓的垃圾,需要被回收。这就是GC工作的原理。为了实现这个原理,GC有多种算法。比较常见的算法有Reference Counting,Mark Sweep,Copy Collection等等。目前主流的虚拟系统.NET CLR,Java VM和Rotor都是采用的Mark Sweep算法。(此段内容来自网络) .NET的GC机制有这样两个问题:   首先,GC并不是能释放所有的资源。它不能自动释放非托管资源。   第二,GC并不是实时性的,这将会造成系统性能上的瓶颈和不确定性。   GC并不是实时性的,这会造成系统性能上的瓶颈和不确定性

delete[] p与delete p的区别

…衆ロ難τιáo~ 提交于 2019-12-24 22:14:53
operator new 和 operator delete函数有两个重载版本,每个版本支持相关的new表达式和delete表达式:void* operator new (size_t); // allocate an object void* operator new [] (size_t); // allocate an array void operator delete (void*); // free an oject void operator delete [] (void*); // free an array熟悉C的朋友看到这里可能会很奇怪: 在c中释放内存用free(void *)【注意这里只有一个参数void *】为什么到了C++里会出现两个!按理说delete 会调用free释放内存的啊? 另外delete []是如何知道删除的对象个数的? 另外一般的教材比如《高质量C++编程指南》都会这么说: 在用delete 释放对象数组时,留意不要丢了符号‘[]’。例如 delete []objects; // 正确的用法 delete objects; // 错误的用法 后者相当于delete objects[0],漏掉了另外99 个对象 这样的描述当然是错误的,而且会误导观众 为了解决问题,打开vc6,输入以下代码:class A { private: int i