ฉันไม่ค่อยชินกับการใช้มากนักweak_ptr
และฉันกำลังเผชิญกับสถานการณ์ที่ค่อนข้างสับสน ฉันกำลังใช้การอัพเดท Intel XE 2019 นักแต่งเพลง 5 ( แพ็คเกจ 2019.5.281 ) เมื่อรวมกันกับVisual Studio 2019 เวอร์ชั่น 16.2.5 ฉันรวบรวมใน 64 บิต ผมใช้มาตรฐานC ++ 17
นี่คือรหัสสำหรับการแก้ปัญหาขัดขวางของฉัน:
#include <memory>
#include <iostream>
using namespace std;
int main( int argc, char* argv[] )
{
shared_ptr<int> sp = make_shared<int>( 42 );
cout << "*sp = " << *sp << endl;
weak_ptr<int> wp = sp;
cout << "*sp = " << *sp << ", *wp = " << *wp.lock() << endl;
wp.reset();
cout << "*sp = " << *sp << endl;
return 0;
}
ผลลัพธ์ที่ฉันคาดว่าจะมีคือ:
*sp = 42
*sp = 42, *wp = 42
*sp = 42
... แต่นี่คือสิ่งที่ฉันได้รับ:
*sp = 42
*sp = 42, *wp = 42
*sp = -572662307
goin คืออะไร เป็นเรื่องปกติหรือไม่ที่shared_ptr
จะแก้ไข / ทำให้ใช้งานไม่ได้เมื่อมีการweak_ptr
รีเซ็ต/ เชื่อมโยงหรือไม่ ฉันสับสนเล็กน้อยเกี่ยวกับผลลัพธ์ที่ได้รับ เพื่อพูดความจริงฉันไม่ได้คาดหวังผลลัพธ์นี้ ...
แก้ไข 1
ในขณะที่ข้อผิดพลาดเกิดขึ้นใน64 บิตการตั้งค่าก็จะไม่ได้อยู่ใน32 บิต ในการกำหนดค่าในภายหลังนี้ผลลัพธ์คือสิ่งที่คาดหวัง
แก้ไข 2
ข้อผิดพลาดเกิดขึ้นเฉพาะในการดีบัก เมื่อฉันสร้างในReleaseฉันได้รับผลลัพธ์ตามที่คาดหวัง
-572662307 = 0xDDDDDDDD
ซึ่งเป็นวิธีของ msvc ในการระบุหน่วยความจำฮีปที่เป็นอิสระ