2009-01-30 63 views
3

我剛剛遇到一個C++ SDK,它大量使用了這個非常奇怪的*new模式。我不明白他們爲什麼這樣做。Widget wag = * new Widget()

用* new構造對象有什麼意義? Widget wag = *new Widget();

更新:有趣的是,他們實際上在做XPtr<T> p = *new T; - 必須是一些智能指針魔術的語義。仍然沒有多大意義。我確信SDK是高質量的。

+0

你的問題是什麼? – 2009-01-30 17:03:56

+0

他問他們爲什麼「這樣做」。 – 2009-01-30 17:06:01

+0

他們*想*泄漏內存? – moonshadow 2009-01-30 17:08:29

回答

4

它構造一個新的對象,然後製作一個副本它。指向原始對象的指針被丟棄,所以可能會有內存泄漏。

雖然沒有必然內存泄漏。它可能是Widget維護其所有實例的列表,並且它在其構造函數和析構函數中更新該列表。可能有其他一些方法來獲得清單的內容。

但似乎沒有意義。原因可能是由於對代碼真正起作用的誤解。找出爲什麼代碼是以這種方式創建的,最好的辦法就是問問編寫代碼的人。代碼評論中可能有線索。你能透露更多關於你在看什麼代碼的細節嗎?

3

這基本上做到這一點:

Widget wag = *(new Widget()); 

// or 
Widget wag; 

我不知道這是否會正確釋放與否。我猜想它不會。

要回答你的問題,我覺得它糟糕的設計選擇。也許他們想開始使用指針,但後來變得醜陋。

4

也許他們正在嘗試內存泄漏?使用新的默認實現將在堆上分配一個Widget,然後從中複製構建Wagget,然後它會及時泄漏新對象。

底線:不要模仿。我會懷疑這個SDK。

編輯:如果這是在一個智能指針的上下文中完成的,那麼它肯定有可能保存指針以便以後刪除。如果有這樣做的XPtr模板,你應該能夠看看代碼,看看它是如何做的。 SDK也應該爲您提供某種關於該構造的文檔,因爲它不正常,而且我真的沒有看到它的優勢。儘管如此,我仍然堅持我所說的:即使這不是一個保證泄漏,我仍然不會模仿它。

1

這不一定是泄漏。例如考慮以下內容

int &a = *new int(); 
delete &a; 

它分配給一個引用。它將保留創建的對象的身份(不創建副本),因此它不會丟失它的蹤跡,並且會在事後將其刪除。把它變成你的代碼的形式,這個類可以被定義爲

template<typename T> 
struct XPtr { 
    T *ptr; 
    XPtr(T &t):ptr(&t) { } 
    ~XPtr() { delete ptr; } 
}; 

... 
XPtr<T> p = *new T; 

甚至更​​複雜,引用計數 - 使得p可以被複制,並XPTR保持其所有副本的軌道,等等。

2

爲REF-計算對象甲黎民智能指針模式是下面的代碼將存儲對象和IncRef它:

SmartPtr<Type> ptr = new Type(); 

而下面的代碼將在物體和存儲IncRef它:

SmartPtr<Type> ptr = *new Type(); 

如果對象的構造函數應用第一個IncRef,則第二種形式非常有用。否則,你的對象的ref計數爲2,當智能指針超出範圍時,它仍然不會釋放該對象。

不知道如果這是你正在使用的庫的情況。儘管如此,仔細閱讀XPtr代碼可能會告訴你。