weak_ptr 재설정이 shared_ptr에 영향을 줍니까?


11

나는 사용에 익숙하지 않으며 매우 weak_ptr혼란스러운 상황에 직면하고 있습니다. 내가 사용하고 인텔 XE 2019 작곡가 업데이트 5 ( 패키지 2019.5.281을 함께 combinaison에) 버전의 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

무슨 일이야? 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

인텔 ICC 측의 실제 버그 인 것 같습니다. 나는 그것을보고했다.

이 문제를 정확히 찾아 낼 수 있도록 다시 한 번 감사드립니다.


1
답변에 버그 보고서에 대한 링크를 추가 할 수 있습니까? 그렇게하면 같은 문제를 가진 사람은 버그 리포트를보고 상태를 알 수 있습니다.
Sander De Dycker

사건이 해결되면 의견을 추가하겠습니다.
dom_beau

1
예, 링크를 추가하십시오-독자는 보고서에 자신의 의견을 추가 할 수 있습니다.
halfer

방법을 보지 마십시오. 링크에 연결되면 인텔 계정이 필요합니까 ??? 어쩌면 내가 틀렸을 까 ??? 말해봐 ... 티켓을 열었고 내 계정에 있습니다.
dom_beau 2009 년

아마 당신은 내가 포럼에서 가지고있는 토론에 도달 할 수 있습니다 : C ++ compiler forum
dom_beau

1

센티넬 값을 가진 디버그 라이브러리의 버그처럼 보입니다. 언급 한 줄을 사용하여 쉽게 확인할 수 있습니다.

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

출력이 2 2대신에 1 2, 컴파일러는 호환되지 않으며, 여전히 그러한 경우를 UB로 간주합니다. 이 경우에는 Sentinel 값이 호출에 잘못 사용될 수 있습니다 reset(). 사전 할당 된 정적 버퍼 내에 새로운 배치로 생성 된 객체를 삭제하는 경우에도 비슷한 현상이 발생합니다. 디버그 모드에서는 센티넬 값이있는 일부 구현으로 덮어 씁니다.


그것은주는 1 2모두 64 비트32 비트 , 디버그릴리스 .
dom_beau

2
버그는 _Ref_count_base기본 cTor에 지정되어 = 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.