Visual Studio ทำอะไรกับตัวชี้ที่ถูกลบและทำไม?


130

หนังสือ C ++ ที่ฉันอ่านระบุว่าเมื่อตัวชี้ถูกลบโดยใช้deleteโอเปอเรเตอร์หน่วยความจำในตำแหน่งที่ชี้ไปนั้น "ว่าง" และสามารถเขียนทับได้ NULLนอกจากนี้ยังระบุว่าตัวชี้จะยังคงชี้ไปที่สถานที่เดียวกันจนกว่าจะมีพระราชเสาวนีย์หรือตั้งค่า

ใน Visual Studio 2012 อย่างไรก็ตาม ดูเหมือนจะไม่เป็นเช่นนั้น!

ตัวอย่าง:

#include <iostream>

using namespace std;

int main()
{
    int* ptr = new int;
    cout << "ptr = " << ptr << endl;
    delete ptr;
    cout << "ptr = " << ptr << endl;

    system("pause");

    return 0;
}

เมื่อฉันคอมไพล์และรันโปรแกรมนี้ฉันจะได้ผลลัพธ์ดังต่อไปนี้:

ptr = 0050BC10
ptr = 00008123
Press any key to continue....

ระบุที่อยู่ที่พอยน์เตอร์ชี้ไปอย่างชัดเจนเมื่อมีการเรียกลบ!

เหตุใดจึงเกิดขึ้น สิ่งนี้เกี่ยวข้องกับ Visual Studio โดยเฉพาะหรือไม่?

และถ้าลบสามารถเปลี่ยนที่อยู่ที่ชี้ไปยังไงก็ได้ทำไมไม่ลบโดยอัตโนมัติตั้งค่าตัวชี้เป็นNULLแทนที่จะเป็นที่อยู่แบบสุ่ม


4
ลบตัวชี้ไม่ได้หมายความว่าจะถูกตั้งค่าเป็น NULL คุณต้องดูแลสิ่งนั้น
แมตต์

11
ฉันรู้ แต่หนังสือที่ฉันกำลังอ่านระบุว่าจะยังคงมีที่อยู่เดิมที่ชี้ไปก่อนที่จะลบ แต่เนื้อหาของที่อยู่นั้นอาจถูกเขียนทับ
tjwrona1992

6
@ tjwrona1992 ใช่เพราะนี่คือสิ่งที่มักเกิดขึ้น หนังสือเล่มนี้แสดงเพียงผลลัพธ์ที่เป็นไปได้มากที่สุดไม่ใช่กฎที่ยาก
SergeyA

5
@ tjwrona1992 หนังสือ C ++ ที่ฉันอ่าน - และชื่อหนังสือคือ ... ?
PaulMcKenzie

4
@ tjwrona1992: มันอาจจะน่าแปลกใจ แต่มันเป็นการใช้ค่าตัวชี้ที่ไม่ถูกต้องทั้งหมดซึ่งเป็นพฤติกรรมที่ไม่ได้กำหนดไม่ใช่แค่การอ้างอิงเท่านั้น "กำลังตรวจสอบว่าชี้ไปที่ใด" IS โดยใช้ค่าในลักษณะที่ไม่อนุญาต
Ben Voigt

คำตอบ:


175

ฉันสังเกตเห็นว่าที่อยู่ที่เก็บไว้ptrมักจะถูกเขียนทับด้วย00008123...

สิ่งนี้ดูแปลกดังนั้นฉันจึงขุดคุ้ยเล็กน้อยและพบว่าบล็อกโพสต์ของ Microsoftนี้มีส่วนที่พูดถึง "การฆ่าเชื้อตัวชี้อัตโนมัติเมื่อลบวัตถุ C ++"

... การตรวจสอบค่า NULL เป็นการสร้างรหัสทั่วไปซึ่งหมายความว่าการตรวจสอบค่า NULL ที่มีอยู่รวมกับการใช้ค่า NULL เป็นค่าการฆ่าเชื้อสามารถซ่อนปัญหาด้านความปลอดภัยของหน่วยความจำของแท้ได้โดยบังเอิญซึ่งสาเหตุที่แท้จริงต้องการการแก้ไข

ด้วยเหตุนี้เราจึงเลือก 0x8123 เป็นค่าการฆ่าเชื้อ - จากมุมมองของระบบปฏิบัติการซึ่งอยู่ในหน้าหน่วยความจำเดียวกับที่อยู่ศูนย์ (NULL) แต่การละเมิดการเข้าถึงที่ 0x8123 จะโดดเด่นกว่าสำหรับนักพัฒนาเนื่องจากต้องการการเอาใจใส่โดยละเอียดมากขึ้น .

ไม่เพียง แต่อธิบายว่า Visual Studio ทำอะไรกับตัวชี้หลังจากที่ลบไปแล้วยังตอบได้ว่าทำไมพวกเขาถึงเลือกไม่ตั้งค่าเป็นNULLอัตโนมัติอีกด้วย!


"คุณลักษณะ" นี้เปิดใช้เป็นส่วนหนึ่งของการตั้งค่า "การตรวจสอบ SDL" ในการเปิด / ปิดการใช้งานให้ไปที่: PROJECT -> Properties -> Configuration Properties -> C / C ++ -> General -> การตรวจสอบ SDL

เพื่อยืนยันสิ่งนี้:

การเปลี่ยนการตั้งค่านี้และการรันโค้ดเดิมซ้ำจะสร้างผลลัพธ์ต่อไปนี้:

ptr = 007CBC10
ptr = 007CBC10

"คุณลักษณะ" อยู่ในเครื่องหมายคำพูดเพราะในกรณีที่คุณมีตัวชี้สองตัวไปยังตำแหน่งเดียวกันการเรียกลบจะล้างเพียงหนึ่งในนั้น อีกอันจะถูกปล่อยให้ชี้ไปยังตำแหน่งที่ไม่ถูกต้อง ...


UPDATE:

หลังจากประสบการณ์การเขียนโปรแกรม C ++ อีก 5 ปีฉันตระหนักดีว่าปัญหาทั้งหมดนี้เป็นจุดที่สงสัย หากคุณเป็นโปรแกรมเมอร์ C ++ และยังคงใช้งานnewและdeleteจัดการตัวชี้ดิบแทนการใช้ตัวชี้อัจฉริยะ (ซึ่งหลีกเลี่ยงปัญหานี้ทั้งหมด) คุณอาจต้องการพิจารณาเปลี่ยนเส้นทางอาชีพเพื่อเป็นโปรแกรมเมอร์ C ;)


12
เป็นการค้นพบที่ดี ฉันหวังว่า MS จะจัดทำเอกสารพฤติกรรมการดีบักแบบนี้ได้ดีขึ้น ตัวอย่างเช่นจะเป็นการดีที่จะทราบว่าเวอร์ชันของคอมไพเลอร์ใดที่เริ่มใช้สิ่งนี้และตัวเลือกใดที่เปิด / ปิดการทำงาน
Michael Burr

5
"จากมุมมองของระบบปฏิบัติการซึ่งอยู่ในหน้าหน่วยความจำเดียวกันกับที่อยู่ศูนย์" - ฮะ? ขนาดเพจมาตรฐาน (ละเว้นเพจขนาดใหญ่) บน x86 ยังคงเป็น 4kb สำหรับทั้ง windows และ linux ไม่ใช่หรือ แม้ว่าฉันจะจำบางอย่างเกี่ยวกับพื้นที่ที่อยู่ 64kb แรกในบล็อกของ Raymond Chen ได้ แต่ในทางปฏิบัติฉันได้ผลลัพธ์เดียวกัน
Voo

12
@Voo windows สงวน RAM 64kB ตัวแรก (และตัวสุดท้าย) เป็นพื้นที่ว่างสำหรับการดักจับ 0x8123 ตกอยู่ในนั้นอย่างสวยงาม
วงล้อประหลาด

7
อันที่จริงก็ไม่ได้ส่งเสริมให้มีนิสัยที่ไม่ดีและมันไม่ได้ช่วยให้คุณสามารถข้ามการตั้งค่าตัวชี้ไปโมฆะ - นั่นคือเหตุผลทั้งหมดที่พวกเขากำลังใช้แทน0x8123 0ตัวชี้ยังคงไม่ถูกต้อง แต่ทำให้เกิดข้อยกเว้นเมื่อพยายามยกเลิกการอ้างอิง (ดี) และไม่ผ่านการตรวจสอบ NULL (ก็ดีเช่นกันเพราะเป็นข้อผิดพลาดที่จะไม่ทำเช่นนั้น) สถานที่สำหรับคนนิสัยไม่ดีอยู่ที่ไหน? มันเป็นเพียงสิ่งที่ช่วยคุณแก้ไขข้อบกพร่อง
Luaan

3
มันไม่สามารถตั้งค่าทั้งสอง (ทั้งหมด) ได้ดังนั้นนี่คือตัวเลือกที่ดีที่สุดอันดับสอง หากคุณไม่ชอบเพียงแค่ปิดการตรวจสอบ SDL - ฉันคิดว่ามันค่อนข้างมีประโยชน์โดยเฉพาะอย่างยิ่งเมื่อทำการดีบักโค้ดของคนอื่น
Luaan

30

คุณจะเห็นผลข้างเคียงของ/sdlตัวเลือกการคอมไพล์ เปิดใช้งานโดยค่าเริ่มต้นสำหรับโครงการ VS2015 ซึ่งจะเปิดใช้งานการตรวจสอบความปลอดภัยเพิ่มเติมนอกเหนือจากที่ / gs มีให้ ใช้โครงการ> คุณสมบัติ> C / C ++> ทั่วไป> การตั้งค่าการตรวจสอบ SDL เพื่อแก้ไข

อ้างจากบทความ MSDN :

  • ดำเนินการฆ่าเชื้อตัวชี้อย่าง จำกัด ในนิพจน์ที่ไม่เกี่ยวข้องกับ dereferences และในประเภทที่ไม่มี destructor ที่ผู้ใช้กำหนดการอ้างอิงตัวชี้จะถูกตั้งค่าเป็นแอดเดรสที่ไม่ถูกต้องหลังจากการเรียกให้ลบ ซึ่งจะช่วยป้องกันการนำการอ้างอิงตัวชี้เก่ามาใช้ซ้ำ

โปรดทราบว่าการตั้งค่าพอยน์เตอร์ที่ถูกลบเป็น NULL เป็นการปฏิบัติที่ไม่ดีเมื่อคุณใช้ MSVC มันเอาชนะความช่วยเหลือที่คุณได้รับจากทั้ง Debug Heap และตัวเลือก / sdl นี้คุณไม่สามารถตรวจจับการโทรฟรี / ลบที่ไม่ถูกต้องในโปรแกรมของคุณได้อีกต่อไป


1
ได้รับการยืนยัน หลังจากปิดใช้งานคุณสมบัตินี้ตัวชี้จะไม่เปลี่ยนทิศทางอีกต่อไป ขอขอบคุณที่ให้การตั้งค่าจริงที่ปรับเปลี่ยน!
tjwrona1992

ฮันส์ยังถือว่าเป็นการปฏิบัติที่ไม่ดีในการตั้งค่าพอยน์เตอร์ที่ถูกลบเป็น NULL ในกรณีที่คุณมีพอยน์เตอร์สองตัวที่ชี้ไปยังตำแหน่งเดียวกัน เมื่อคุณdeleteเป็นหนึ่ง Visual Studio จะปล่อยให้ตัวชี้ที่สองชี้ไปยังตำแหน่งเดิมซึ่งตอนนี้ไม่ถูกต้อง
tjwrona1992

1
ค่อนข้างไม่ชัดเจนสำหรับฉันว่าคุณคาดหวังว่าเวทมนตร์ประเภทใดที่จะเกิดขึ้นโดยการตั้งค่าตัวชี้เป็น NULL ตัวชี้อื่นนั้นไม่ได้ช่วยแก้ปัญหาอะไรเลยคุณยังต้องมีตัวจัดสรรการดีบักเพื่อค้นหาจุดบกพร่อง
Hans Passant

3
VS ไม่ทำความสะอาดพอยน์เตอร์ มันทำให้พวกเขาเสียหาย ดังนั้นโปรแกรมของคุณจะพังเมื่อคุณใช้ต่อไป ตัวจัดสรรการดีบักทำสิ่งเดียวกันกับหน่วยความจำฮีป ปัญหาใหญ่กับ NULL มันไม่เสียหายเพียงพอ หรือเป็นกลยุทธ์ทั่วไป Google "0xdeadbeef"
Hans Passant

1
การตั้งค่าตัวชี้เป็น NULL ยังดีกว่าปล่อยให้ชี้ไปยังที่อยู่ก่อนหน้าซึ่งตอนนี้ไม่ถูกต้อง การพยายามเขียนไปยังตัวชี้ NULL จะไม่ทำให้ข้อมูลเสียหายและอาจทำให้โปรแกรมขัดข้อง การพยายามใช้ตัวชี้ซ้ำ ณ จุดนั้นอาจไม่ถึงกับทำให้โปรแกรมขัดข้อง แต่ก็อาจให้ผลลัพธ์ที่ไม่อาจคาดเดาได้!
tjwrona1992

19

นอกจากนี้ยังระบุว่าตัวชี้จะยังคงชี้ไปยังตำแหน่งเดิมจนกว่าจะถูกกำหนดใหม่หรือตั้งค่าเป็น NULL

นั่นเป็นข้อมูลที่ทำให้เข้าใจผิดแน่นอน

ระบุที่อยู่ที่พอยน์เตอร์ชี้ไปอย่างชัดเจนเมื่อมีการเรียกลบ!

เหตุใดจึงเกิดขึ้น สิ่งนี้เกี่ยวข้องกับ Visual Studio โดยเฉพาะหรือไม่?

สิ่งนี้อยู่ในข้อกำหนดของภาษาอย่างชัดเจน ไม่ถูกต้องหลังจากการเรียกร้องให้ptr deleteการใช้ptrหลังจากได้รับdeleted เป็นสาเหตุของพฤติกรรมที่ไม่ได้กำหนด อย่าทำ สภาพแวดล้อมเวลาทำงานมีอิสระที่จะทำสิ่งที่มันต้องการที่จะมีหลังจากที่โทรไปptrdelete

และถ้าลบสามารถเปลี่ยนที่อยู่ที่ชี้ไปยังไงก็ได้ทำไมไม่ลบโดยอัตโนมัติตั้งค่าตัวชี้เป็น NULL แทนที่จะเป็นที่อยู่แบบสุ่ม ???

การเปลี่ยนค่าของตัวชี้เป็นค่าเก่าจะอยู่ในข้อกำหนดของภาษา เท่าที่เปลี่ยนเป็น NULL บอกเลยว่าจะแย่ โปรแกรมจะทำงานในลักษณะที่มีเหตุผลมากขึ้นหากตั้งค่าของตัวชี้เป็น NULL อย่างไรก็ตามนั่นจะซ่อนปัญหา เมื่อโปรแกรมถูกคอมไพล์ด้วยการตั้งค่าการปรับให้เหมาะสมที่แตกต่างกันหรือย้ายไปยังสภาพแวดล้อมที่แตกต่างกันปัญหาจะปรากฏขึ้นในช่วงเวลาที่ไม่เหมาะสมที่สุด


1
ฉันไม่เชื่อว่าจะตอบคำถามของ OP ได้
SergeyA

ไม่เห็นด้วยแม้ว่าจะแก้ไขแล้วก็ตาม การตั้งค่าเป็น NULL จะไม่ซ่อนปัญหา - อันที่จริงมันจะเปิดเผยในหลายกรณีมากกว่าที่จะไม่มีสิ่งนั้น มีเหตุผลที่การใช้งานปกติไม่ทำเช่นนี้และเหตุผลก็แตกต่างกัน
SergeyA

4
@SergeyA การใช้งานส่วนใหญ่ไม่ได้ทำเพื่อประสิทธิภาพ อย่างไรก็ตามหากการใช้งานตัดสินใจที่จะตั้งค่าจะเป็นการดีกว่าที่จะตั้งค่าเป็นสิ่งที่ไม่ใช่โมฆะ มันจะเปิดเผยปัญหาเร็วกว่าถ้าตั้งค่าเป็น NULL ตั้งค่าเป็น NULL การเรียกdeleteสองครั้งบนตัวชี้จะไม่ทำให้เกิดปัญหา นั่นไม่ดีแน่นอน
ราหู

ไม่ไม่ใช่ประสิทธิภาพ - อย่างน้อยก็ไม่ใช่ประเด็นหลัก
SergeyA

7
@SergeyA การตั้งค่าตัวชี้เป็นค่าที่ไม่ใช่NULLแต่ยังอยู่นอกกระบวนการอย่างแน่นอน 'พื้นที่ที่อยู่จะแสดงกรณีมากกว่าสองทางเลือกอื่น การปล่อยให้ห้อยไม่จำเป็นต้องทำให้เกิดข้อผิดพลาดหากใช้หลังจากปล่อยให้เป็นอิสระ การตั้งค่าให้NULLไม่ทำให้เกิดความผิดพลาดหากdeleted อีกครั้ง
Blacklight Shining

10
delete ptr;
cout << "ptr = " << ptr << endl;

โดยทั่วไปแล้วการอ่าน (เช่นเดียวกับที่คุณทำข้างต้นหมายเหตุ: สิ่งนี้แตกต่างจากการยกเลิกการอ้างอิง) ค่าของตัวชี้ที่ไม่ถูกต้อง (ตัวชี้จะไม่ถูกต้องเช่นเมื่อคุณdeleteใช้) เป็นพฤติกรรมที่กำหนดการนำไปใช้งาน นี้เป็นที่รู้จักในCWG # ดูเพิ่มเติมที่นี่

โปรดทราบว่าก่อนหน้านั้นการอ่านค่าของตัวชี้ที่ไม่ถูกต้องเป็นพฤติกรรมที่ไม่ได้กำหนดไว้ดังนั้นสิ่งที่คุณมีข้างต้นจึงเป็นพฤติกรรมที่ไม่ได้กำหนดซึ่งหมายความว่าทุกอย่างอาจเกิดขึ้นได้


3
ที่เกี่ยวข้องคือคำพูดจาก[basic.stc.dynamic.deallocation]: "ถ้าอาร์กิวเมนต์ที่กำหนดให้กับฟังก์ชัน deallocation ในไลบรารีมาตรฐานเป็นตัวชี้ที่ไม่ใช่ค่าตัวชี้ว่างฟังก์ชันการจัดสรรจะยกเลิกการจัดสรรหน่วยเก็บข้อมูลที่อ้างถึงโดยตัวชี้การแสดงผลตัวชี้ทั้งหมดที่อ้างถึงใด ๆ ส่วนหนึ่งของพื้นที่จัดเก็บที่ไม่ได้ปันส่วน "และกฎใน[conv.lval](ส่วน 4.1) ที่ระบุว่าการอ่าน (การแปลงค่า lvalue-> rvalue) ค่าตัวชี้ที่ไม่ถูกต้องเป็นพฤติกรรมที่กำหนดโดยการนำไปใช้งาน
Ben Voigt

แม้แต่ UB ก็สามารถนำไปใช้งานได้ในลักษณะเฉพาะโดยผู้ขายที่เชื่อถือได้อย่างน้อยก็สำหรับคอมไพเลอร์นั้น หาก Microsoft ได้ตัดสินใจที่จะใช้คุณลักษณะการฆ่าเชื้อตัวชี้ก่อน CWG # 1438 นั่นจะไม่ทำให้คุณลักษณะนั้นมีความน่าเชื่อถือมากขึ้นหรือน้อยลงและโดยเฉพาะอย่างยิ่งมันไม่เป็นความจริงที่จะ "มีอะไรเกิดขึ้น" หากคุณลักษณะนั้นเปิดอยู่ โดยไม่คำนึงถึงสิ่งที่มาตรฐานระบุ
Kyle Strand

@KyleStrand: โดยพื้นฐานแล้วฉันให้คำจำกัดความของ UB ( blog.regehr.org/archives/213 )
giorgim

1
ให้มากที่สุดของ C ++ ชุมชนในดังนั้น "อะไรจะเกิดขึ้น" ถูกนำตัวทั้งหมดด้วยตัวอักษร ผมคิดว่านี่เป็นเรื่องน่าขัน ฉันเข้าใจคำจำกัดความของ UB แต่ฉันก็เข้าใจด้วยว่าคอมไพเลอร์เป็นเพียงส่วนหนึ่งของซอฟต์แวร์ที่ดำเนินการโดยคนจริงๆและหากคนเหล่านั้นใช้คอมไพเลอร์เพื่อให้มันทำงานในลักษณะที่แน่นอนนั่นคือวิธีที่คอมไพเลอร์จะทำงานโดยไม่คำนึงถึงสิ่งที่มาตรฐานกล่าว .
Kyle Strand

1

ฉันเชื่อว่าคุณกำลังเรียกใช้โหมดดีบักบางประเภทและ VS กำลังพยายามกำหนดตำแหน่งตัวชี้ของคุณใหม่ไปยังตำแหน่งที่รู้จักเพื่อให้สามารถตรวจสอบและรายงานความพยายามที่จะยกเลิกการอ้างอิงเพิ่มเติมได้ ลองคอมไพล์ / รันโปรแกรมเดียวกันในโหมดรีลีส

โดยทั่วไปแล้วตัวชี้จะไม่ถูกเปลี่ยนภายในdeleteเพื่อประสิทธิภาพและเพื่อหลีกเลี่ยงการให้ความคิดที่ผิด ๆ เกี่ยวกับความปลอดภัย การตั้งค่าตัวชี้ลบเป็นค่าที่กำหนดไว้ล่วงหน้าจะไม่ได้ผลดีในสถานการณ์ที่ซับซ้อนส่วนใหญ่เนื่องจากตัวชี้ที่ถูกลบมีแนวโน้มที่จะเป็นเพียงหนึ่งในหลาย ๆ ตัวที่ชี้ไปยังตำแหน่งนี้

ตามความเป็นจริงยิ่งฉันคิดเกี่ยวกับเรื่องนี้มากเท่าไหร่ฉันก็ยิ่งพบว่า VS เป็นฝ่ายผิดเมื่อทำเช่นนั้นตามปกติ จะเกิดอะไรขึ้นถ้าตัวชี้เป็น const? มันยังจะเปลี่ยนไหม


ใช่แม้ตัวชี้คงที่จะเปลี่ยนเส้นทางไปยัง 8123 ลึกลับนี้!
tjwrona1992

มีหินอีกก้อนหนึ่งไปที่ VS :) เมื่อเช้านี้มีคนถามว่าทำไมพวกเขาควรใช้ g ++ แทน VS นี่มันไป
SergeyA

7
@SergeyA แต่จากอีกด้านหนึ่งการลบตัวชี้ที่ถูกลบจะแสดงให้คุณเห็นโดย segfault ว่าคุณพยายามยกเลิกตัวชี้ที่ถูกลบและมันจะไม่เท่ากับ NULL ในอีกกรณีหนึ่งมันจะพังก็ต่อเมื่อหน้านั้นได้รับอิสระด้วย (ซึ่งไม่น่าเป็นไปได้มาก) ล้มเหลวเร็วขึ้น แก้ได้เร็วขึ้น
วงล้อประหลาด

1
@ratchetfreak "ล้มเหลวเร็วแก้เร็ว" เป็นมนต์ที่มีค่ามาก แต่ "ล้มเหลวอย่างรวดเร็วด้วยการทำลายหลักฐานทางนิติวิทยาศาสตร์ที่สำคัญ" ไม่ได้เริ่มต้นมนต์ที่มีค่าเช่นนี้ ในกรณีง่ายๆอาจสะดวก แต่ในกรณีที่ซับซ้อนมากขึ้น (สิ่งที่เรามักต้องการความช่วยเหลือมากที่สุด) การลบข้อมูลที่มีค่าจะลดเครื่องมือที่มีในการแก้ปัญหาของฉัน
Cort Ammon

2
@ tjwrona1992: Microsoft กำลังทำสิ่งที่ถูกต้องในความคิดของฉัน การทำความสะอาดตัวชี้หนึ่งตัวจะดีกว่าการไม่ทำเลย และหากสิ่งนี้ทำให้คุณเกิดปัญหาในการดีบักให้วางจุดพักก่อนการเรียกลบที่ไม่ถูกต้อง อัตราต่อรองคือหากไม่มีสิ่งนี้คุณจะไม่พบปัญหา และถ้าคุณมีวิธีแก้ปัญหาที่ดีกว่าในการค้นหาจุดบกพร่องเหล่านี้ให้ใช้และทำไมคุณถึงสนใจสิ่งที่ Microsoft ทำ?
Zan Lynx

0

หลังจากลบตัวชี้หน่วยความจำที่ชี้ไปอาจยังใช้ได้ เพื่อแสดงข้อผิดพลาดนี้ค่าตัวชี้จะถูกกำหนดเป็นค่าที่ชัดเจน สิ่งนี้ช่วยกระบวนการดีบักได้มาก หากตั้งค่าเป็นค่าNULLนี้อาจไม่แสดงเป็นจุดบกพร่องที่อาจเกิดขึ้นในขั้นตอนของโปรแกรม NULLดังนั้นจึงอาจซ่อนข้อผิดพลาดเมื่อคุณทดสอบภายหลังกับ

อีกประเด็นหนึ่งคือเครื่องมือเพิ่มประสิทธิภาพรันไทม์บางตัวอาจตรวจสอบค่านั้นและเปลี่ยนแปลงผลลัพธ์

ในช่วงเวลาก่อนหน้านี้ MS ตั้งค่าเป็น0xcfffffff.

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.