redefinição fraca_ptr afeta shared_ptr


11

Não estou muito acostumado a usar weak_ptre estou enfrentando uma situação bastante confusa. Estou usando o Intel XE 2019 Composer atualização 5 ( pacote 2019.5.281 ) em combinação com o Visual Studio 2019 ver. 16.2.5 . Eu compilo em 64 bits. Eu uso o padrão C ++ 17 .

Aqui está o código para minha solução de spike:

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

A saída que eu esperava ter é:

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

... mas aqui está o que eu obtive:

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

O que está acontecendo? É normal shared_ptrque seja modificado / invalidado quando o / um associado weak_ptré redefinido? Estou um pouco confuso com os resultados que obtive. Para dizer a verdade, eu não esperava esse resultado ...

EDIT 1

Enquanto o erro ocorre na configuração de 64 bits , não ocorre em 32 bits . Nesta configuração posterior, o resultado é o que é esperado.

EDIT 2

O erro ocorre apenas na depuração . Quando crio no Release , obtenho o resultado esperado.



2
Eu acho que sua implementação tem um bug. O gcc produz os resultados corretos #
NathanOliver 04/10/19

11
Não é possível reproduzir no Visual Studio 2019 (v. 16.2.5)
Frodyne 4/19/19

11
Não, isso definitivamente não é normal.
Freakish

4
Em caso de ajuda de depuração, -572662307 = 0xDDDDDDDDque é forma de indicar memória heap libertado da msvc
Eric

Respostas:


2

Parece que é um bug real no lado da Intel ICC; Eu relatei isso.

Obrigado novamente por me ajudar a identificar esse problema.


11
Você poderia adicionar um link ao relatório de bug na sua resposta? Dessa forma, qualquer pessoa com o mesmo problema pode ser encaminhada ao relatório de erros por seu status.
Sander De Dycker 7/10/19

Prefiro adicionar um comentário assim que o caso for resolvido.
dom_beau 7/10/19

11
Sim, por favor, para adicionar o link - isso permitirá que os leitores adicionem suas próprias observações ao relatório.
halfer 9/10/19

Não vejo como. Se você acessar o link, precisará de uma conta Intel para vê-lo ??? Talvez eu esteja errado??? Diga-me ... Abri um ticket e ele está na minha conta.
dom_beau 9/10/19

Talvez você possa acessar a discussão que estou tendo no fórum: Fórum do compilador C ++
dom_beau

1

Parece um bug na biblioteca de depuração, com valores de sentinela. É fácil verificar, usando a linha que mencionei:

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

Se a saída for em 2 2vez de 1 2, o compilador não é compatível e, possivelmente, ainda considera esse caso um UB. Os valores do Sentinel podem ser usados ​​erroneamente nesse caso com a chamada de reset(). O mesmo ocorre com a exclusão do objeto criado pela colocação de novo no buffer estático pré-alocado, no modo de depuração ele é substituído por algumas implementações com valores sentinela.


1 2nas versões de 64 e 32 bits , Debug and Release .
dom_beau

2
O bug está no _Ref_count_basecTor padrão especificado = default. Os dois membros _Uses = 1e _Weaks = 1são definidos como 1e 0respectivamente. Parece que o cTor gerado padrão está com erros. Veja o memoryarquivo ...
dom_beau 4/10/19

@dom_beau bem, vale a pena de um relatório, também sabemos que a inicialização no C ++ é sério Bonkers
Swift - Sexta-feira Pie
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.