代码之家  ›  专栏  ›  技术社区  ›  Martijn Courteaux

C++:破坏静态素材的最佳方法

  •  5
  • Martijn Courteaux  · 技术社区  · 15 年前

    Foo.h公司

    class GLUtesselator;
    
    class Foo
    {
    private:
        static GLUtesselator *tess;
    public:
        Foo();
        virtual ~Foo();
    }
    

    Foo.cpp文件

    #include "Foo.h"
    
    #include <GL/glu.h>
    
    GLUtesselator *Foo::tess = gluNewTess(); // System call
    
    Foo::Foo() {}
    Foo::~Foo()
    {
         // And of course I don't want to destruct it here,
         // because I'm going to use the tesselator in other instances of Foo
         // Otherwise:
         // gluDeleteTess(tess);
    }
    

    有没有更好的替代方法来删除静态内容并在应用程序终止时调用它?
    或者我可以说:“哦,不管怎样,申请被终止了。操作系统将释放内存?

    4 回复  |  直到 15 年前
        1
  •  7
  •   Loki Astari    15 年前

    很简单。不要使静态成员成为指针。

    Foo.h公司

    #include <GL/glu.h>
    
    class Foo
    {
        private:
            static GLUtesselator  tess;
        public:
                     Foo();
            virtual ~Foo();
    };
    

    Foo.cpp文件

    // 
    GLUtesselator  Foo::tess;
    

    Foo.h公司

    #include <GL/glu.h>
    
    typedef std::shared_ptr<GLUtesselator,void (*)(GLUtesselator*)> AutoGluTess;
    class Foo
    {
        private:
            static AutoGluTess  tess;
        public:
                     Foo();
            virtual ~Foo();
    };
    

    Foo.cpp文件

    // 
    AutoGluTess    Foo::tess(gluNewTess(), &gluDeleteTess);
    
        2
  •  2
  •   Peter Alexander    15 年前

    你不需要毁掉它。我所知道的所有操作系统都会正确地释放内存,并在应用程序终止时释放对象持有的任何资源(注意:析构函数不会自动调用,但资源将被释放)。

    如果你

    1. auto_ptr tr1::unique_ptr 这样,当指针对象超出范围(位于静态变量应用程序的末尾)时,它就会被自动删除。
        3
  •  2
  •   Lior Kogan    15 年前

    CFoo* pFoo= NULL;
    
    void DoneFoo()
    {
        delete pFoo;
    }
    
    void Init()
    {
        pFoo= new CFoo();
        atexit(DoneFoo);
    }
    

    或:

    class CFoo
    {
         ......
    };
    
    #define NewFoo(F_name)                                                             \
        CFoo* F_name##Init();                                                          \
        void  F_name##Done();                                                          \
        CFoo* F_name= F_name##Init();                                                  \
        CFoo* F_name##Init()  { CFoo* F= new CFoo(); atexit(F_name##Done); return F; } \
        void  F_name##Done()  { delete F_name; }    
    
    NewFoo(F1);
    

    对于成员静态变量:

    class CFoo
    {
        static int* pKuku;
        static void DoneKuku() { delete pKuku;                     }
        static int* InitKuku() { atexit(DoneKuku); return new int; }
    public:
    };
    
    int* CFoo::pKuku= CFoo::InitKuku();
    

    我不认为让操作系统自动释放内存是个好主意,因为你会有内存泄漏。当你有'合法'内存泄漏-这将是很难注意'非法'的,所以你应该努力没有内存泄漏在所有。

        4
  •  1
  •   Bwmat    15 年前

    因为它是静态的,所以只有一个实例。除非这个臀肌振荡器真的很大,否则我怀疑你是否需要自己去释放它。

    就像你说的,“哦,不管怎样,申请被终止了。操作系统将释放内存……”

    推荐文章