在 C++ 中分配一個(gè)未初始化內(nèi)存,然后讀取它,會(huì)讀取到這塊內(nèi)存之前被使用所留下的值,這種現(xiàn)象我稱之為 flashback。
站在用戶的角度思考問(wèn)題,與客戶深入溝通,找到龍沙網(wǎng)站設(shè)計(jì)與龍沙網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、國(guó)際域名空間、網(wǎng)頁(yè)空間、企業(yè)郵箱。業(yè)務(wù)覆蓋龍沙地區(qū)。
for (int i = 0; i < 10; ++i) {
int a;
std::cout << a << " ";
a = i;
}
這段代碼可能輸出
0 0 1 2 3 4 5 6 7 8
除了第一個(gè) 0,其余的 0 1 2 3 4 5 6 7 8 都是 flashback 的結(jié)果
struct A
{
int8_t m1[13];
int x;
};
for (int i = 0; i < 10; ++i) {
A* a = new A;
std::cout << a->x << " ";
a->x = i;
delete a;
}
std::cout << std::endl;
這段代碼仍然可能輸出
0 0 1 2 3 4 5 6 7 8
除了第一個(gè) 0,其余的 0 1 2 3 4 5 6 7 8 都是 flashback 的結(jié)果。
在實(shí)際的業(yè)務(wù)邏輯代碼中,new 操作可能深埋在復(fù)雜代碼之中,并且不同對(duì)象的 new 操作也會(huì)相互影響。
struct A
{
int8_t m1[13];
int x;
};
struct B
{
int8_t m1[13];
int x;
};
// cs1
A* a1 = new A;
a1->x = 66;
delete a1;
// cs2
/*
B* b1 = new B;
b1->x = 22;
delete b1;
*/
// cs3
A* a2 = new A;
delete a2;
std::cout << a1 << " " << a2 << " " << std::boolalpha << (a1 == a2) << " " << a2->x << std::endl;
這段代碼可能輸出
0x1b05eb0 0x1b05eb0 true 66
成功觀測(cè)到了 flashback
把 cs2 的注釋解開,可能輸出
0x1718eb0 0x1718eb0 true 22
假設(shè) cs2 的執(zhí)行次數(shù)是隨機(jī)的,或者 b1->x = 22
的 22 是隨機(jī)的,并且只觀測(cè) a1 和 a2 的關(guān)系,那么觀測(cè)到 flashback 的次數(shù)也是隨機(jī)的。