zayıf_ptr sıfırlama paylaşılan_ptr'u etkiler mi?


11

Kullanmaya pek alışkın weak_ptrdeğilim ve oldukça kafa karıştırıcı bir durumla karşı karşıyayım. Ben kullanıyorum Intel XE 2019 Besteci güncelleme 5 ( paket 2019.5.281 ile combinaison olarak) ver Visual Studio 2019. 16.2.5 . 64 bit derliyorum. Standart C ++ 17 kullanıyorum .

İşte benim spike çözümü için kod:

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

Beklediğim çıktı:

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

... ama elde ettiğim şey:

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

Ne oluyor? shared_ptr/ A ilişkilendirildiğinde weak_ptrsıfırlandığında değiştirilmesi / geçersiz kılınması normal midir? Elde ettiğim sonuçlar hakkında biraz kafam karıştı. Doğruyu söylemek gerekirse bu sonucu beklemiyordum ...

DÜZENLEME 1

Hata 64 bit yapılandırmada ortaya çıkarken, 32 bit değil . Bu sonraki yapılandırmada, sonuç beklenen sonuçtur.

DÜZENLEME 2

Hata yalnızca Hata Ayıklama'da oluşur . Ben oluştururken Release , beklediğim sonuç almak.



2
Bence uygulamanızın bir hatası var. gcc doğru sonuçları verir
NathanOliver

1
Visual Studio 2019'da çoğaltılamıyor (v. 16.2.5)
Frodyne

1
Hayır, bu kesinlikle normal değil.
ucube

4
Hata ayıklamaya yardımcı olması durumunda -572662307 = 0xDDDDDDDD, msvc'nin serbest yığın hafızasını gösterme şekli
Eric

Yanıtlar:


2

Intel ICC tarafında gerçek bir hata gibi görünüyor; Rapor ettim.

Bu sorunu tespit etmeme yardımcı olduğun için tekrar teşekkürler.


1
Cevabınızdaki hata raporuna bir bağlantı ekleyebilir misiniz? Bu şekilde, aynı sorunu olan herkes durumu için hata raporuna yönlendirilebilir.
Sander De Dycker

Vaka düzeltildikten sonra bir yorum eklemeyi tercih ederim.
dom_beau

1
Evet, lütfen bağlantıyı ekleyin - bu, okuyucuların rapora kendi yorumlarını eklemesine izin verecektir.
halfer

Nasıl olduğunu göremiyorum. Bağlantıya ulaşırsanız, görmek için bir Intel hesabınızın olması gerekir ??? Belki de ben hatalıyım??? Söylesene ... Bir bilet açtım ve hesabımda.
dom_beau

Belki forumda yaşadığım tartışmaya ulaşabilirsiniz: C ++ derleyici forumu
dom_beau

1

Hata ayıklama kütüphanesinde sentinel değerlere sahip bir hata gibi görünüyor. Bahsettiğim satırı kullanarak kontrol etmek kolaydır:

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

Çıktı 2 2yerine 1 2, derleyici uyumlu değildir ve muhtemelen hala böyle bir UB olarak kabul eder. Bu durumda sentinel değerleri hatalı olarak kullanılabilir reset(). Benzer bir şey, önceden yerleştirilmiş statik arabellek içinde yeni yerleşim tarafından oluşturulan nesnenin silinmesiyle olur, hata ayıklama modunda sentinel değerleri olan bazı uygulamalar tarafından üzerine yazılır.


O verir 1 2hem de 64 bit ve 32 bit , Debug ve Release .
dom_beau

2
Hata, _Ref_count_basevarsayılan olarak belirtilen cTor'dur = default. İki üye ve sırasıyla _Uses = 1ve _Weaks = 1olarak ayarlanır . Varsayılan olarak oluşturulan cTor hatalıdır. Dosyaya bakın ...10memory
dom_beau

@dom_beau iyi, bir rapora değer, ayrıca C ++ 'da Başlatma'nın Ciddi Bonkers
Swift - Friday Pie
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.