weak_ptr reset ส่งผลต่อ shared_ptr หรือไม่


11

ฉันไม่ค่อยชินกับการใช้มากนัก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ฉันได้รับผลลัพธ์ตามที่คาดหวัง



2
ฉันคิดว่าการใช้งานของคุณมีข้อบกพร่อง gcc ให้ผลลัพธ์ที่ถูกต้อง
NathanOliver

1
ไม่สามารถทำซ้ำใน Visual Studio 2019 (v. 16.2.5)
Frodyne

1
ไม่นี่ไม่ปกติแน่นอน
แปลก

4
ในกรณีที่ช่วยแก้ไขข้อผิดพลาด-572662307 = 0xDDDDDDDDซึ่งเป็นวิธีของ msvc ในการระบุหน่วยความจำฮีปที่เป็นอิสระ
Eric

คำตอบ:


2

ดูเหมือนว่ามันจะเป็นข้อผิดพลาดที่แท้จริงของ Intel ICC ฉันได้รายงานแล้ว

ขอขอบคุณอีกครั้งที่ช่วยฉันระบุปัญหานี้


1
คุณสามารถเพิ่มลิงค์ไปยังรายงานข้อผิดพลาดในคำตอบของคุณ? ด้วยวิธีนี้ทุกคนที่มีปัญหาเดียวกันสามารถอ้างถึงรายงานข้อบกพร่องสำหรับสถานะของมัน
Sander De Dycker

ฉันจะเพิ่มความคิดเห็นเมื่อเคสได้รับการแก้ไข
dom_beau

1
ใช่โปรดเพิ่มลิงก์ - ซึ่งจะช่วยให้ผู้อ่านเพิ่มคำพูดของตนเองในรายงาน
halfer

ไม่เห็นวิธี หากคุณไปที่ลิงก์คุณต้องมีบัญชี Intel เพื่อดู บางทีฉันผิด บอกฉันที ... ฉันเปิดตั๋วและมันอยู่ในบัญชีของฉัน
dom_beau

บางทีคุณสามารถเข้าถึงการสนทนาที่ฉันมีอยู่ในฟอรัม: C ++ คอมไพเลอร์ฟอรัม
dom_beau

1

ดูเหมือนว่าบั๊กในไลบรารี debug พร้อมด้วยค่า Sentinel ง่ายต่อการตรวจสอบโดยใช้บรรทัดที่ฉันกล่าวถึง:

int i = 1; cout << i << " " << ++i << endl;

ถ้าเอาท์พุท2 2แทน1 2คอมไพเลอร์จะไม่เข้ากันและอาจจะยังคงพิจารณากรณีดังกล่าวเป็น UB ค่า Sentinel อาจถูกใช้อย่างผิดพลาดในกรณีนี้เมื่อมีการเรียกreset()ใช้ สิ่งที่คล้ายกันเกิดขึ้นกับการลบวัตถุที่สร้างขึ้นโดยการจัดวางใหม่ภายในบัฟเฟอร์สแตติกแบบ preallocated ในโหมดดีบักมันจะถูกเขียนทับโดยการใช้งานบางอย่างที่มีค่า Sentinel


มันจะให้1 2ทั้ง64 บิตและ32 บิต , ตรวจแก้จุดบกพร่องและการวางจำหน่าย
dom_beau

2
ข้อผิดพลาดอยู่ใน_Ref_count_basector = defaultเริ่มต้นซึ่งมีการระบุ สมาชิกทั้งสอง_Uses = 1และ_Weaks = 1ถูกตั้งค่า1และ0ตามลำดับ ดูเหมือนว่า cTor ที่สร้างขึ้นเป็นค่าเริ่มต้นจะถูกบั๊ก ดูmemoryไฟล์ ...
dom_beau

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