你可以使用一些C++ 11層的功能,使這個更便攜,但是這可能足以作爲一個起點:
類
template<typename T>
class t_secure_destruct {
static const size_t Size = sizeof(T);
static const size_t Align = alignof(T);
public:
t_secure_destruct() : d_memory() {
new(this->d_memory)T;
}
~t_secure_destruct() {
reinterpret_cast<T*>(this->d_memory)->~T();
this->scribble();
}
// @todo implement or delete op-assign and remaining constructors
public:
T& get() {
return *reinterpret_cast<T*>(this->d_memory);
}
const T& get() const {
return *reinterpret_cast<const T*>(this->d_memory);
}
private:
void scribble() {
for (size_t idx(0); idx < Size; ++idx) {
this->d_memory[idx] = random();
}
}
private:
__attribute__((aligned(Align))) char d_memory[Size];
};
演示
#include <iostream>
class t_test {
public:
t_test() : a(-1) {
std::cout << "construct\n";
}
~t_test() {
std::cout << "destruct\n";
}
public:
void print() const {
std::cout << "a = " << a << "\n";
}
public:
int a;
};
int main(int argc, const char* argv[]) {
t_secure_destruct<t_test>test;
test.get().print();
test.get().a = 100;
test.get().print();
return 0;
}
當然,如果您喜歡,也可以使用堆分配來支持該分配。如果您需要智能優化器,則可能需要將塗鴉器放在觸手可及的地方。
聲音合理。然而,用隨機擦拭似乎沒有什麼好處,簡單的調零應該能夠完成這項工作。該解決方案不會試圖阻止某人讀取內存芯片或類似的東西,僅僅針對訪問內存的另一個進程。還是有理由在這種情況下使用隨機數據? – Suma
該解決方案似乎使用GCC特定功能(屬性)。根本就沒有理由使用char來存儲?爲什麼不使用原始類型? – Suma
@Suma完全取決於你想完成什麼。零也會很好 - 這只是一個例證。 – justin