2012-09-26 123 views
0

我試圖做這樣的事情在我的Obj類:分配空指針

public: 
    template <typename T> 
    Obj(T & o) { 
     siz = sizeof(o); 

     p = malloc(siz); 
     memcpy(p, &o, siz); 
    } 
private:         
    void * p; 
    size_t siz; 

,如果我這樣做這工作正常:

string str = "foobar"; 
Obj u = Obj(str); 

但如果我這樣做:

Obj u = Obj(string("foobar")); 

這會導致字符串填充隨機字符。

中檢索我使用的字符串:

string S() { 
    return *((string *)p); 
} 

任何想法?

+4

_I'm試圖做這樣的事情_你爲什麼試圖這樣做?無論你想要做什麼,都可能有更好的方法。 –

+0

此代碼的每一行看起來像一個可怕的噩夢。你真的想要達到什麼目標? –

+0

提示:memcpy不屬於C++代碼 –

回答

2

正如其他人所說的,你不應該這樣做。你給出的代碼示例不適用於任何不是POD的東西(http://stackoverflow.com/questions/146452/what-are-pod-types-in-c)。當您執行memcpy時,您可能無法正確初始化新對象。例如。如果它的成員是指針。在字符串的情況下,它的實現可能持有一個指向原始字符串所擁有的字符緩衝區的指針。當原始字符串被刪除時,字符緩衝區也會被刪除。但是你的memcopied對象仍然會指向已刪除的緩衝區。

1

那麼,你很難猜出你想要做什麼。

你似乎在做的是製作一個對象的二進制副本,這是一切惡劣事件的嚴重情況。在你的第一種情況下,你正在對「真實」對象做這件事,所以它可能看起來工作,因爲原始對象(str對象)仍然在附近,所以無論指向拷貝包含的指針仍然指向「有效」數據。在第二種情況下,您正在對臨時對象執行該操作,該對象會在事件之後立即釋放,這可能是爲什麼您的「副本」只有垃圾。

無論哪種方式,從它的外觀來看,兩者實際上都沒有做任何可重新調整的東西。我會說,你的第一個例子似乎只是工作。