delete

智能指针与句柄类(二)

心已入冬 提交于 2020-03-30 16:44:12
   之前文章 提到写时复制(copy-on-write)技术,要实现这种功能,针对上文中Handle代码,需要将size_t * use这个抽象出来,封装成一个引用计数类,提供写时复制功能。CUseCount类实现如下: 1 class CUseCount 2 { 3 public: 4 CUseCount(); 5 CUseCount(const CUseCount&); 6 ~CUseCount(); 7 8 bool only()const; //判断引用计数是否为0, 句柄类无法访问private int*p, 故提供此函数 9 bool reattach(const CUseCount&); //对计数器的操作, 用来代替 operator = 10 11 bool makeonly(); //写时复制, 表示是否需要赋值对象本身 12 13 private: 14 CUseCount& operator=(const CUseCount&); //提供reattach函数代替 operator = 15 int *p; //实现计数 16 }; 17 18 CUseCount::CUseCount():p(new int(1)) 19 {} 20 21 CUseCount::CUseCount(const CUseCount& u):p(u.p) 22 { 23 ++

转:SQLServer级联删除示例

自古美人都是妖i 提交于 2020-03-30 04:00:02
SQLServer 2000与Oracle 8i相比较,在级联删除上有太多的限制 表内自关联不支持级联删除和级联更新 一个表内在有多个列同时关联于另一个表时,不支持多个级联删除 还有什么循环级联删除限制,等等 ....... 一大堆限制,如果要迁移Oracle到SqlServer麻烦多多,特别对于用于构造树型结构的表内自关联(比如部门表)的级联删除特别讨厌 考虑来考虑去,对于SqlServer不能支持的诸多级联删除只有采用最原始的方法,彻底不用外键关联,而是用触发器来解决 以下是经过验证的触发器实现范例(自关联例子) 放弃外键关联后所有的完整性检查都要通过触发器实现 -- DELETE 级联删除,先删除,再删除所有级联的记录,采用递归触发器,当然要求数据库支持递归触发器功能开启(数据库属性设置中开启他),不过SqlServer只支持32级的递归啊 IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE NAME = 'DEL_DOCUMENTTYPE_001' AND TYPE = 'TR') DROP TRIGGER DEL_DOCUMENTTYPE_001 GO CREATE TRIGGER DEL_DOCUMENTTYPE_001 ON dbo.DOCUMENTTYPE FOR DELETE AS IF (SELECT COUNT(*)

研一寒假04_static&组合类型

给你一囗甜甜゛ 提交于 2020-03-30 02:41:08
#--------------------------------static&组合类型----------------------------------# /* c++管理数据内存方式 */ //自动存储:在函数内部定义的常规变量使用中断存储空间,称为自动变量(存储在栈中),意味着他们在所属的函数被调用时自动产生,在函数结束时消亡(内存自动释放) //静态存储:在函数外面定义或者是使用关键字static定义的变量,在整个程序执行期间都存在,例如:static double fee=56.50; //动态存储:使用new创建和使用delete释放内存的变量,new和delete管理一个内存池,这个内存池有别于用于静态存储和自动存储的内存,数据的生命周期不完全受函数的生存或程序控制,程序员有更大的控制权 //内存泄漏:使用new分配内存之后,没有使用delete释放内存 /* 组合类型 */ #include <iostream> //新建一个结构 struct inflatable { int year; int month; }; //主函数 int main() { //使用新类型定义结构 inflatable s01,s02,s03; //使用类型inflatable创建结构变量s01,s02,s03 s01.year = 1998; //给s01中的成员year赋值 /

C++:new与malloc的区别

只谈情不闲聊 提交于 2020-03-29 18:07:31
1.属性 new/delete是操作符,是C++关键字,需要编译器支持;malloc/free是库函数,需要头文件支持。 2.参数 使用new操作符动态分配内存时无需指定内存块大小,编译器会根据类型自行计算;malloc分配内存时需要显式地指出所需内存块大小。 3.返回类型 new操作符内存分配成功时会返回相应对象类型的指针,无需进行强制类型转换,符合类型安全性,分配失败时会抛出bac_alloc异常;malloc分配内存成功时会返回void*类型的指针,需要通过强制类型转换为所需类型,分配失败时返回NULL值。 4.非内部数据对象 new会先调用operator new函数,申请足够的内存,再调用类型的构造函数,初始化成员变量,最后返回自定义类型的指针;delete会先调用析构函数,然后调用operator delete函数释放内存;malloc/free是库函数,只能动态申请内存及释放内存,无法完成构造函数及析构函数的工作。 5.重载 C++允许重载new/delete(实际上是重载operator new 和operator delete),特别的,布局new(placement new)就不需要为对象分配内存,而是使用指定一个地址作为内存起始区域,new在这段内存上完成对象的构造函数调用并初始化该内存段,并返回此内存地址;malloc/free不允许重载。 6.内存区域

[cmd] 循环删除 obj、bin 文件夹

做~自己de王妃 提交于 2020-03-29 18:00:27
@echo off set nowpath=%cd% cd \ cd %nowpath% ::delete specify file(*.pdb,*.vshost.*) for /r %nowpath% %%i in (*.pdb,*.vshost.*) do (del %%i && echo delete %%i) ::delete specify folder(obj,bin) for /r %nowpath% %%i in (obj,bin) do (IF EXIST %%i (RD /s /q %%i && echo delete %%i)) pause    来源: https://www.cnblogs.com/Areas/p/12593527.html

j

最后都变了- 提交于 2020-03-28 15:00:19
j ava的StringBuffer类 (转自他人的) StringBuffer类和String一样,也用来代表字符串,只是由于StringBuffer的内部实现方式和String不同,所以StringBuffer在进行字符串处理时,不生成新的对象,在内存使用上要优于String类。所以在实际使用时,如果经常需要对一个字符串进行修改,例如插入、删除等操作,使用StringBuffer要更加适合一些。 在StringBuffer类中存在很多和String类一样的方法,这些方法在功能上和String类中的功能是完全一样的。但是有一个最显著的区别在于,对于StringBuffer对象的每次修改都会改变对象自身,这点是和String类最大的区别。 另外由于StringBuffer是线程安全的,关于线程的概念后续有专门的章节进行介绍,所以在多线程程序中也可以很方便的进行使用,但是程序的执行效率相对来说就要稍微慢一些。 1、StringBuffer对象的初始化   StringBuffer对象的初始化不像String类的初始化一样,Java提供的有特殊的语法,而通常情况下一般使用构造方法进行初始化。   例如: StringBuffer s = new StringBuffer();    这样初始化出的StringBuffer对象是一个空的对象。   

C++中的自动存储、静态存储和动态存储

孤人 提交于 2020-03-28 07:10:27
根据用于分配内存的方法,C++中有3中管理数据内存的方式:自动存储、静态存储和动态存储(有时也叫做自由存储空间或堆)。在存在是间的长短方面,以这三种方式分配的数据对象各不相同。下面简要介绍这三种类型(注:C++11中新增了第四种类型——线程存储) 1.自动存储 在函数内部定义的常规变量使用自动存储空间,被称为自动变量(automatic variable),这意味着它们在所属的函数被调用时自动产生,在该函数结束时消亡。例如,挡在一个自定义的函数getname()中定义了一个temp数组时,temp数组仅当getname()函数活动时存在。当成许控制权回到main()时,temp使用的内存将自动被释放。如果getname()返回temp的地址,则main()中的name指针指向的内存将很快得到重新使用。这就是在getname()中使用new的原因之一。 实际上,自动变量是一个局部变量,其作用域为包含它的代码块。代码块是被包含在花括号中的一段代码。 自动变量通常存储在栈中。这意味着执行代码块时,其中的变量将依次加入到栈中,而在离开代码块时,将按相反的顺序释放着些变量,着被称为后进先出(LIFO)。因此,在程序执行过程中,栈将不断地增大和缩小。 2.静态存储 静态存储是整个程序执行期间都存在的存储方式。是变量称为静态的方式有两种:一种是在函数外面定义它

明晰C++内存分配的五种方法的区别

给你一囗甜甜゛ 提交于 2020-03-28 05:52:56
在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。   栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。   堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。   自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。   全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。   常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改,而且方法很多,在《const的思考》一文中,我给出了6种方法)   明确区分堆与栈   在bbs上,堆与栈的区分问题,似乎是一个永恒的话题,由此可见,初学者对此往往是混淆不清的,所以我决定拿他第一个开刀。   首先,我们举一个例子: void f() { int* p=new int[5]; }   这条短短的一句话就包含了堆与栈,看到new,我们首先就应该想到,我们分配了一块堆内存,那么指针p呢

明晰C++内存分配的五种方法的区别

和自甴很熟 提交于 2020-03-28 05:52:32
在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。    栈 ,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区。里面的变量通常是局部变量、函数参数等。    堆 ,就是那些由new分配的内存块,它们的释放编译器不管,而是由程序员自己去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。    自由存储区 ,就是那些由malloc等分配的内存块,它和堆是十分相似的,不过它是用free来结束自己的生命的。    全局/静态存储区 ,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。    常量存储区 ,这是一块比较特殊的存储区,它们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改,而且方法很多,在《const的思考》一文中,我给出了6种方法) 明确区分堆与栈   在bbs上,堆与栈的区分问题,似乎是一个永恒的话题,由此可见,初学者对此往往是混淆不清的,所以我决定拿它第一个开刀。   首先,我们举一个例子: void f() { int* p=new int[5]; }   这条短短的一句话就包含了堆与栈,看到new,我们首先就应该想到,我们分配了一块堆内存

明晰C++内存分配的五种方法的区别

余生颓废 提交于 2020-03-28 05:49:34
在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。   栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。   堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。   自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。   全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。   常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改,而且方法很多,在《const的思考》一文中,我给出了6种方法)   明确区分堆与栈   在bbs上,堆与栈的区分问题,似乎是一个永恒的话题,由此可见,初学者对此往往是混淆不清的,所以我决定拿他第一个开刀。   首先,我们举一个例子: void f() { int* p=new int[5]; }   这条短短的一句话就包含了堆与栈,看到new,我们首先就应该想到,我们分配了一块堆内存,那么指针p呢