Saya tidak terlalu terbiasa menggunakan weak_ptr
dan saya menghadapi situasi yang cukup membingungkan. Saya menggunakan Intel XE 2019 Composer pembaruan 5 ( paket 2019.5.281 ) dalam kombinasi dengan Visual Studio 2019 ver. 16.2.5 . Saya kompilasi dalam 64-bit. Saya menggunakan standar C ++ 17 .
Berikut adalah kode untuk solusi spike saya:
#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;
}
Output yang saya harapkan adalah:
*sp = 42
*sp = 42, *wp = 42
*sp = 42
... tapi inilah yang saya dapatkan:
*sp = 42
*sp = 42, *wp = 42
*sp = -572662307
Apa yang sedang terjadi? Apakah normal untuk shared_ptr
dimodifikasi / tidak valid ketika / yang terkait weak_ptr
direset? Saya sedikit bingung dengan hasil yang saya peroleh. Sejujurnya saya tidak mengharapkan hasil ini ...
EDIT 1
Sementara bug terjadi dalam konfigurasi 64-bit , itu tidak dalam 32-bit . Dalam konfigurasi nanti ini, hasilnya adalah apa yang diharapkan.
EDIT 2
Bug hanya terjadi di Debug . Ketika saya membuat Rilis , saya mendapatkan hasil yang diharapkan.
sumber
-572662307 = 0xDDDDDDDD
yang merupakan cara msvc untuk menunjukkan memori tumpukan yang dibebaskanJawaban:
Tampaknya itu adalah bug nyata di sisi Intel ICC; Saya sudah melaporkannya.
Sekali lagi terima kasih telah membantu saya menunjukkan masalah ini.
sumber
Sepertinya bug di perpustakaan debug, dengan nilai sentinel. Mudah untuk memeriksa, dengan menggunakan baris yang saya sebutkan:
Jika output
2 2
bukan1 2
, maka kompiler tidak sesuai dan mungkin masih menganggap hal tersebut sebagai UB. Nilai sentinel dapat digunakan secara salah dalam hal ini dengan panggilanreset()
. Hal yang sama terjadi dengan menghapus objek yang dibuat oleh penempatan baru dalam buffer statis yang telah dialokasikan, dalam mode debug itu akan ditimpa oleh beberapa implementasi dengan nilai-nilai sentinel.sumber
1 2
baik dalam 64-bit dan 32-bit , Debug dan Rilis ._Ref_count_base
cTor default yang ditentukan= default
. Dua anggota_Uses = 1
dan_Weaks = 1
diatur ke1
dan0
masing - masing. Tampaknya cTor yang dihasilkan default disadap. Lihatmemory
file ...