Thiết lập lại yếu_ptr ảnh hưởng đến shared_ptr?


11

Tôi không quen sử dụng weak_ptrvà tôi đang đối mặt với một tình huống khá khó hiểu. Tôi đang sử dụng Intel XE 2019 Composer update 5 ( gói 2019.5.281 ) kết hợp với Visual Studio 2019 ver. 16.2.5 . Tôi biên dịch trong 64-bit. Tôi sử dụng C ++ 17 tiêu chuẩn .

Đây là mã cho giải pháp tăng đột biến của tôi:

#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;
}

Đầu ra tôi dự kiến ​​sẽ có:

*sp = 42
*sp = 42, *wp = 42
*sp = 42

... nhưng đây là những gì tôi thu được:

*sp = 42
*sp = 42, *wp = 42
*sp = -572662307

Goin là gì? Có phải là bình thường shared_ptrđể được sửa đổi / không hợp lệ khi / một liên kết weak_ptrđược thiết lập lại? Tôi hơi bối rối về kết quả tôi đạt được. Nói thật là tôi không mong đợi kết quả này ...

CHỈNH SỬA 1

Mặc dù lỗi xảy ra trong cấu hình 64 bit , nhưng nó không xảy ra ở 32 bit . Trong cấu hình sau này, kết quả là những gì được mong đợi.

CHỈNH SỬA 2

Lỗi chỉ xảy ra trong Debug . Khi tôi xây dựng trong Bản phát hành , tôi nhận được kết quả mong đợi.



2
Tôi nghĩ rằng việc thực hiện của bạn có một lỗi. gcc tạo ra kết quả chính xác
NathanOliver

1
Không thể sao chép trong Visual Studio 2019 (câu 16.2.5)
Frodyne

1
Không, điều này chắc chắn là không bình thường.
quái dị

4
Trong trường hợp nó giúp gỡ lỗi, -572662307 = 0xDDDDDDDDđó là cách chỉ ra bộ nhớ heap được giải phóng của msvc
Eric

Câu trả lời:


2

Có vẻ như đó là một lỗi thực sự về phía Intel ICC; Tôi đã báo cáo nó.

Cảm ơn một lần nữa vì đã giúp tôi xác định chính xác vấn đề này.


1
Bạn có thể thêm một liên kết đến báo cáo lỗi trong câu trả lời của bạn? Bằng cách đó, bất kỳ ai có cùng vấn đề đều có thể được chuyển đến báo cáo lỗi về tình trạng của nó.
Sander De Dycker

Tôi sẽ thay vì thêm một bình luận một khi vụ việc sẽ được khắc phục.
dom_beau

1
Có, vui lòng thêm liên kết - điều này sẽ cho phép người đọc thêm nhận xét của riêng họ vào báo cáo.
tạm dừng

Đừng xem thế nào. Nếu bạn đạt được liên kết, bạn cần một tài khoản Intel để xem nó ??? Có lẽ tôi sai??? Nói cho tôi biết ... tôi đã mở một vé và nó nằm trong tài khoản của tôi.
dom_beau

Có lẽ bạn có thể tham gia cuộc thảo luận mà tôi đang có trong diễn đàn: Diễn đàn trình biên dịch C ++
dom_beau

1

Nó trông giống như một lỗi trong thư viện gỡ lỗi, với các giá trị sentinel. Thật dễ dàng để kiểm tra, bằng cách sử dụng dòng tôi đã đề cập:

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

Nếu đầu ra là 2 2thay thế 1 2, thì trình biên dịch không tuân thủ và có thể vẫn coi trường hợp đó là một UB. Giá trị Sentinel có thể được sử dụng sai trong trường hợp này với lệnh gọi của reset(). Điều tương tự xảy ra với việc xóa đối tượng được tạo bởi vị trí mới trong bộ đệm tĩnh preallocated, trong chế độ gỡ lỗi, nó bị ghi đè bởi một số triển khai với các giá trị sentinel.


Nó cung cấp 1 2cả 64 bit32 bit , Gỡ lỗiPhát hành .
dom_beau

2
Các lỗi trong _Ref_count_basecTor mặc định được chỉ định = default. Hai thành viên _Uses = 1_Weaks = 1được thiết lập 10tương ứng. Có vẻ như cTor được tạo mặc định đã bị lỗi. Xem memorytệp ...
dom_beau

@dom_beau tốt, nó đáng để báo cáo, chúng tôi cũng biết rằng Khởi tạo trong C ++ là Nghiêm túc Bonkers
Swift - Thứ Sáu Pie
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.