我知道memset對class
初始化是皺眉。例如,像下面這樣:如何在不打開vtbl的情況下完成memset(this,...)的等價操作?
class X { public:
X() { memset(this, 0, sizeof(*this)) ; }
...
} ;
會揍了vtbl
如果有在驢友中有virtual
功能。
我正在研究C-ish但以C++編譯的(冗長的)遺留代碼庫,因此所有有問題的成員通常都是POD,並且不需要傳統的C++構造函數。 C++的使用逐漸增多(像虛擬函數),這讓那些沒有意識到memset具有這些額外C++牙齒的開發人員咬牙咬牙。
我想知道是否有一個C++安全的方式來做一個初始的全部捕獲零初始化,可以通過特定的by-member初始化,其中零初始化不適當?
我找到類似的問題memset for initialization in C++和zeroing derived struct using memset。這兩個都有「不使用memset()」的答案,但沒有好的選擇(尤其是可能包含許多成員的大型結構)。
一般你把第一個字段的地址從那裏清除。毫無疑問,這違反了一些規則,但它總是對我有用。 –
另一種選擇是爲班級編寫自己的alloc例程,這樣可以確保清除空間,但IIRC對此有限制。 –
難道你不是指'memset(this,0,sizeof * this)'? (是的,這也會打破vtbl。) –