C++
可以通过引用计数的机制。。。实现内存回收,不要让内存泄漏。
涉及到内存的泄露的问题:
很多人会忘记,这时候智能指针就派上用处了,可以帮助程序员自动在析构函数中释放。两个类:
第一个问题想法:同归于尽smartPointer中的指针就是object的指针
class Object {
public:
int a,b;
};
int main(){
    while(true){
        smartPointer p(new Object());
        Process(p);
    }
}
void Process(Object &p){
    //do something;
}
class smartPointer{
public:
    smartPointer(Object *p){
        ptr=p;
    }
    ~smartPointer(){
        delete ptr;
    }
private: Object  *ptr;
};
第二个问题:
引用计数类~~~~~~~~~~~!!!!!!!!!!记录当前有多少指针指向这个内存。
STL不是基于引用计数的:outo_ptr 同一时刻一个指针只能有一个被一个对象拥有。。。缺点:不能赋值操作,不能参数传递~,
基于计数的:boost库的shared_ptr!!!!!!!!!
可能在:
构造,复制,赋值=
发生指针指向和指针计数的问题
定义指向counter的指针Smartpointepro
定义指向内存(object)的指针counter
友元类 可以访问Counter类的成员

class Object {
public:
int a,b;
};
int main(){
    while(true){
        smartPointer p(new Object());
        Process(p);
    }
}
void Process(Object &p){
    //do something;
}
class Conter_Smartpointer{
public:
    Conter_Smartpointer(Object *p){//普通的构造  产生新内存
        cSp=new Counter(p);
    }
     Conter_Smartpointer(Conter_Smartpointe &p){//指向同样的内存,复制
        cSp=p.cSp;
        cSp->cnt++;
    }
    Conter_Smartpointer& operate=(Conter_Smartpointer &p){//赋值
        //right++  left --
        cSp->cnt--;被右边的覆盖掉了,指向右边的内存了  原来的引用计数减一
        p.cSp->cnt++;
        if(cSp->cnt == 0){
            delete cSp;
        }
         
         cSp=p.cSp;
    }
    ~Conter_Smartpointer(){
        cSp->cnt--;
       if(cSp->cnt == 0){
            delete cSp;
        }
    }
    
    
private: Counter  *cSp;//指向同一个counter
};
class Counter(){
friend class Conter_Smartpointer;//Conter_Smartpointer可以访问counter类的成员(包括私有成员)
pravite:
int cnt;
Object *ptr;
Counter(){
    p=NULL;
    cnt=0;
}
Counter(Object *p){
    ptr = p;
    cnt=1;
}
第三个问题:
父亲指向儿子,儿子指向父亲,没有一个先释放。。环
解决:boost::weak_ptr
赋值传递:对传入的实参进行拷贝~在函数里处理不会影响原来的对象
引用:相反
资源管理(内存就是资源):
在c++常利用对资源的包装~防止内存泄漏
设计模式:
一个类只能一个对象~
应用于:系统日志的输出,一个界面只有一个鼠标 鼠标类。。
1.一个类只能一个对象~
2.内存的释放
3.线程安全,多个类产生一个对象
有什么问题:
class Singleton(){
private: 
    Singleton(){
    }
  
    static Singleton* instance;
public:
    static Singleton* GetInstance(){
        if(instance == NULL){
            instance = new Singleton();
        }
        
        
    }
    
}
想要产生一个类只能通过GetInstance()
让构造函数是私有的,这样别的类就不能访问这个构造函数
函数传递 和赋值的问题:可能会产生多个对象的问题
无析构:因为无对象:static 定义的类属于整个类,不存在析构。static一旦被构造赋值,就不允许修改。在静态存储区。
对于释放内存的问题,new出来的在堆中产生,必须手动释放
staic在静态存储区,这样操作系统自动释放内存
方法一:如何保证线程安全&&内存不用手动释放
static Singleton instance;当再次调用就直接使用instance:保证只产生一个对象
class Singleton(){ private: Singleton(){ } Singleton(Singleton &p){ } Singleton& operate = (const Singleton &p){ } public: static Singleton* GetInstance(){ static Singleton instance; return &instance; } }
方法二:保证线程安全
double check 加锁
后记:
明天就是十一之后的第一个工作日,在我印象里HR说会给我通知。。。哎~当时也没认真听,毕竟是第一次面试,直接3面过了我也很惊讶~也有点懵,因为我连面试时什么样的都不知道。。。。哎,希望能有个好结果吧。
为保研付出了一年,当时听到政策的时候傻掉了,没保上研。也没有哭,第二天我就立刻调整好心情决定我要找工作,不考研!!!虽然一道题没刷过。心里还是慌的,就在leetcode上学代码。等我学一半的时候我忽然发现好多公司也走了。
十一假期,我也在充实自己,下面做个总结吧。先总结下C++基础吧,毕竟第二个面试就是在C++基础上挂了。。。我对不起一面的学长送我的娃娃。。。。哎。。。
好冷 好冷啊!!!
原文:http://www.cnblogs.com/ldphoebe/p/5937249.html