2008年1月31日

常用路由协议

RIP/OSPF/IGRP/BGP

posted @ 2008-01-31 21:24 浴盆 阅读(159) 评论(0) 编辑

关于内存泄露

内存泄漏可以分为4类:
1. 常发性内存泄漏。发生内存泄漏的代码会被多次执行到,每次被执行的时候都会导致一块内存泄漏。
2. 偶发性内存泄漏。发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。常发性和偶发性是相对的。对于特定的环境,偶发性的也许就变成了常发性的。所以测试环境和测试方法对检测内存泄漏至关重要。
3. 一次性内存泄漏。发生内存泄漏的代码只会被执行一次,或者由于算法上的缺陷,导致总会有一块仅且一块内存发生泄漏。比如,在类的构造函数中分配内存,在析构函数中却没有释放该内存,所以内存泄漏只会发生一次。
4. 隐式内存泄漏。程序在运行过程中不停的分配内存,但是直到结束的时候才释放内存。严格的说这里并没有发生内存泄漏,因为最终程序释放了所有申请的内存。但是对于一个服务器程序,需要运行几天,几周甚至几个月,不及时释放内存也可能导致最终耗尽系统的所有内存。所以,我们称这类内存泄漏为隐式内存泄漏。

从用户使用程序的角度来看,内存泄漏本身不会产生什么危害,作为一般的用户,根本感觉不到内存泄漏的存在。真正有危害的是内存泄漏的堆积,这会最终消耗尽系统所有的内存。从这个角度来说,一次性内存泄漏并没有什么危害,因为它不会堆积,而隐式内存泄漏危害性则非常大,因为较之于常发性和偶发性内存泄漏它更难被检测到。

posted @ 2008-01-31 21:19 浴盆 阅读(342) 评论(0) 编辑

不使用第三个变量交换两个变量

#include<iostream>
using namespace std;

int main()
{
    
int a,b;
    cin
>>a;
    cin
>>b;

    cout
<<"交换前"<<endl;
    cout
<<"a = "<<a<<endl;
    cout
<<"b = "<<b<<endl;
    

    a 
= a+b;
    b 
= a -b;
    a 
= a -b;

    cout
<<"交换后"<<endl;
    cout
<<"a = "<<a<<endl;
    cout
<<"b = "<<b<<endl;
    
    
return 0;
}

posted @ 2008-01-31 20:34 浴盆 阅读(388) 评论(7) 编辑

struct和union的大小问题

union类型以其中size最大的为其大小
struct类型以其中所有size大小之和为其大小
#include<iostream>
using namespace std;

int main()
{
    typedef union 
{long i; int k[5]; char c;} DATE;
    
struct data int cat; DATE cow; double dog;} too;
    DATE max;

    cout
<<"sizeof(struct date)+sizeof(max) = "<<sizeof(too)+sizeof(max)<<endl;
    cout
<<"sizeof(too) = "<<sizeof(too)<<endl;
    cout
<<"sizeof(max) = "<<sizeof(max)<<endl;
    cout
<<"struct data.cow size = "<<sizeof(too.cow)<<endl;
    cout
<<"union DATE.i size = "<<sizeof(max.i)<<endl;
    cout
<<"union char.c size = "<<sizeof(max.c)<<endl;

}
sizeof(struct date)+sizeof(max)返回52
#include<iostream>
using namespace std;

int main()
{
    typedef union student 
{
       
char name[10];
       
long sno; 
       
char sex; 
       
float score [4]; 
}
 STU; 

STU a[
5];

cout
<<sizeof(a)<<endl;

return 0;

}
 
初始化了一个含有5个UNION的数组,由于UNION以其中最大的元素float作为大小  16*5=80

#include<iostream>
using namespace std;

int main()
{
    typedef 
struct student 
{
       
char name[10];
       
long sno; 
       
char sex; 
       
float score [4]; 
}
 STU; 

STU a[
5];

cout
<<sizeof(a)<<endl;

return 0;

}
 
输出为180
自然对齐(natural alignment)即默认对齐方式,是指按结构体的成员中(类型)size最大的成员作为基本的分配单元,而且与其顺序有这密切的联系。size最大的是long,size是 4,所以,按照顺序,Char name[10];12个字节;Long sno; 4个字节;Char sex; 4个字节(这里对齐了);Float score [4]; 16个字节。于是(12+4+4+16)×5=180

#include<iostream>
using namespace std;

int main()
{
    typedef 
struct student 
{
       
char name[10];
       
char sex; 
       
long sno; 
       
float score [4]; 
}
 STU; 

STU a[
5];

cout
<<sizeof(a)<<endl;

return 0;

}
 

答案是:160. 为什么,只是换了顺序而已呀?关键就在顺序上。

结构体中,size最大的是long,size是 4,所以,按照顺序,Char name[10];12个字节;但是这12中多分配的2个字节可以包含后面的Char sex; (问题就在这Float score [4]; 16个字节。于是(12+4+16)×5=160

posted @ 2008-01-31 17:42 浴盆 阅读(862) 评论(0) 编辑

struct和union的大小问题

union类型以其中size最大的为其大小
struct类型以其中所有size大小之和为其大小
#include<iostream>
using namespace std;

int main()
{
    typedef union 
{long i; int k[5]; char c;} DATE;
    
struct data int cat; DATE cow; double dog;} too;
    DATE max;

    cout
<<"sizeof(struct date)+sizeof(max) = "<<sizeof(too)+sizeof(max)<<endl;
    cout
<<"sizeof(too) = "<<sizeof(too)<<endl;
    cout
<<"sizeof(max) = "<<sizeof(max)<<endl;
    cout
<<"struct data.cow size = "<<sizeof(too.cow)<<endl;
    cout
<<"union DATE.i size = "<<sizeof(max.i)<<endl;
    cout
<<"union char.c size = "<<sizeof(max.c)<<endl;

}

posted @ 2008-01-31 17:33 浴盆 阅读(92) 评论(0) 编辑

static全局变量与普通的全局变量的区别/static局部变量和普通局部变量的区别/static函数与普通函数的区别

全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此可以避免在其它源文件中引起错误。

static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;
static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;
static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝。

posted @ 2008-01-31 17:14 浴盆 阅读(2198) 评论(0) 编辑

c++中的局部变量和全局变量重名时取值问题

局部变量在使用时会屏蔽全局变量。要用全局变量,需要使用"::".
局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内。

#include<iostream>
using namespace std;
void test();
int i = 1;
int main()
{
    
int i = 2;

    cout
<<"global i = "<<::i<<"   "<<"address = "<<&::i<<endl;

    cout
<<"main() i = "<<i<<"   "<<"address = "<<&i<<endl;

    test();

    
{
        cout
<<"main() i = "<<i<<"   "<<"address = "<<&i<<endl;
        
int i = 3;
        cout
<<"local i = "<<i<<"   "<<"address = "<<&i<<endl;
    }

}

void test()
{
    
int i = 4;
    cout
<<"test() i = "<<i<<"   "<<"address = "<<&i<<endl;
    cout
<<"global i = "<<::i<<"   "<<"address = "<<&::i<<endl;
}



 

posted @ 2008-01-31 17:01 浴盆 阅读(760) 评论(0) 编辑