2010-04-18 162 views

回答

2

你指的是以下?是的,這是允許的。如果你需要

class Class { 
    static Base *b; 
}; 

Base *Class::b = new Derived(); 

使用智能指針將其銷燬當程序退出

class Class { 
    static boost::scoped_ptr<Base> b; 
}; 

boost::scoped_ptr<Base> Class::b(new Derived()); 
+0

在這種情況下,有可能爲類的析構函數刪除靜態變量? – dmessf 2010-04-18 16:34:23

+0

@Zibd,類的析構函數與此無關。該對象是在沒有任何'Class'構造函數的情況下創建的,並且它將被銷燬(如果您命令這樣做),而不使用其析構函數執行任何操作。 Con/destructor只對該類的實例有效。 – 2010-04-18 16:37:01

+0

@Zibd:它*可能*但可能不是你想要的。如果你有一百萬個使用靜態變量的類的實例,並且只有一個停止存在,那麼剩下的就是使用你已經刪除的東西。也許你應該給我們一個更大的想法。 – GManNickG 2010-04-18 16:39:06

2

它可能不會讓有很大的意義,但你肯定可以做到這一點:

static int * p = new int(1); 

這個問題是在具有破壞的對象。這可能沒有多大關係在實踐中,除非析構函數有一定的副作用(如寫入文件),您需要,在這種情況下,靜態智能指針將(可能)做的工作。

話雖如此,

static int i = 1; 

似乎在幾乎所有情況下優選的。

編輯:我誤解了你的問題,但我會在這裏留下,因爲它確實建議模糊的好習慣。

1

如果你想確保它得到程序退出後的清理:

struct foo 
{ 
    static double* d; 
}; 

namespace 
{ 
    void delete_double(void) 
    { 
     delete foo::d; 
    } 

    double* get_double(void) 
    { 
     double* result = new double(); 
     atexit(delete_double); 

     return result; 
    } 
} 

double* foo::d = get_double(); 

或者使用智能指針(見Johannes answer

1

在聲明中:

static cMyClass* p = new cMyClass() ; 

p稱爲「靜態動態變量」是不正確的。它是一個類型爲cMyClass *的靜態指針變量,指向一個動態分配的對象。

通過稱之爲「靜中有動」的變量,你說得好像是一個悖論,而實際上它是一個簡單的東西,可能是完全合理的一個貧窮的描述。有兩個變量:1)靜態的指針,2)動態的對象。