2013-04-05 47 views
0
struct Temp 
{ 
    CString one; 
    CString two; 
}; 

class Foo 
{ 
    public: 
     Temp obj; 
     void somewhere(); 
} 

void Foo::somewhere() 
{ 
    void* pData = static_cast<void*>(&obj); 
    OwnMethod(pData); // void OwnMethod(void*); 
} 

的問題是: 我應該建立obj上堆或這種情況並不危險(通過本地類對象的指針)?本地對象指針

+3

完全取決於OwnMethod用指針做些什麼。這是一個有生之年的問題,對象被指向在指針之前死亡。如果是這樣,那麼你有問題,否則你沒事。 – john 2013-04-05 14:10:04

+0

爲什麼不使用OwnMethod(void *)不使用模板? – 2013-04-05 14:14:18

+0

回答信息太少,投票結束。 – Lundin 2013-04-05 14:19:35

回答

5

如果OwnMethod(pData)將指針存儲起來供以後使用,那麼一旦調用Foo::somewhere()的對象被銷燬,那麼以後就不可能再使用了。

如果OwnMethod(pData)只訪問指向數據,你是安全的。

3

成員變量將持續與Foo對象相同的長度,因此指針在調用OwnMethod期間將有效。

如果該函數將指針的某個副本存儲在某處,並且其他內容稍後使用該指針,那麼在Foo(因此指針的目標)已被銷燬後可能會訪問它。有各種方法來防止這種情況發生;正如你所說,一個是動態分配對象,然後傳遞或共享所有權,當它傳遞到OwnMethod。智能指針(如std::unique_ptrstd::shared_ptr)是跟蹤動態對象所有權的一種非常好的方法。

1

哇,很多問題。

一個複雜的對象不應該被傳遞給任何無效的東西*。

誰寫的OwnMethod?

爲什麼不需要Foo *類型的指針?

事實上,爲什麼不參考Foo型號&?

如果OwnMethod()可能需要接受幾個不同類型的對象,那麼它應該接受一個基類指針或引用並使用多態性。

但是,只要包裝類一直存在,只要生命週期參數爲obj就會存在,所以如果指針未超出OwnMethod的範圍,那麼這是可以的。如果OwnMethod導致指針被存儲在Foo的生命週期以外的其他地方,那麼你有一個問題,也許obj應該分配在堆上。 (它甚至可能根本不適合它成爲Foo的成員。)