দুর্বল_সিপি রিসেট ভাগ করে নেওয়া_আপনারকে প্রভাবিত করে?


11

আমি ব্যবহারে weak_ptrখুব অভ্যস্ত নই এবং আমি বেশ বিভ্রান্তিকর পরিস্থিতির মুখোমুখি হয়েছি। আমি ভিজুয়াল স্টুডিও 2019 ভারের সংমিশ্রণে ইন্টেল এক্সই 2019 এর সুরকার আপডেট 5 ( প্যাকেজ 2019.5.281 ) ব্যবহার করছি । 16.2.5 । আমি 64-বিট মধ্যে সংকলন। আমি স্ট্যান্ডার্ড সি ++ 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

ত্রুটিটি যখন -৪-বিট কনফিগারেশনে ঘটে তবে তা 32-বিটে হয় না । এই পরবর্তী কনফিগারেশনে, ফলাফলটি প্রত্যাশিত।

সম্পাদনা 2

বাগটি কেবলমাত্র ডিবাগে ঘটে । আমি যখন রিলিজে তৈরি করি তখন আমি প্রত্যাশিত ফলাফলটি পাই।



2
আমি মনে করি আপনার বাস্তবায়নে একটি বাগ আছে।
জিসিসি

1
ভিজ্যুয়াল স্টুডিও 2019-এ পুনরুত্পাদন করা যাবে না (বনাম 16.2.5)
ফ্রডোইন

1
না, এটি অবশ্যই স্বাভাবিক নয়।
অকৃত্রিম

4
ক্ষেত্রে এটি -572662307 = 0xDDDDDDDDডিবাগকে সহায়তা করে , যা এমএসভিসি'র ফ্রিড হিপ মেমরির ইঙ্গিত করার উপায়
এরিক

উত্তর:


2

এটি প্রদর্শিত হয় এটি ইন্টেল আইসিসির পক্ষে একটি বাস্তব বাগ; আমি এটি রিপোর্ট করেছি।

এই সমস্যাটিকে পিন-পয়েন্ট করতে সাহায্য করার জন্য আবারও ধন্যবাদ।


1
আপনি নিজের উত্তরে বাগ রিপোর্টটিতে একটি লিঙ্ক যুক্ত করতে পারবেন? এইভাবে, একই সমস্যা সহ যে কেউ তার স্থিতির জন্য বাগ রিপোর্টে উল্লেখ করা যেতে পারে।
Sander De Dycker

মামলাটি স্থির হয়ে গেলে আমি বরং একটি মন্তব্য যুক্ত করব।
dom_beau

1
হ্যাঁ লিঙ্কটি যুক্ত করতে দয়া করে - এটি পাঠকদের প্রতিবেদনে তাদের নিজস্ব মন্তব্য যুক্ত করার অনুমতি দেবে।
অর্ধেক

দেখুন না কিভাবে। আপনি যদি লিঙ্কটিতে পৌঁছান, এটি দেখতে আপনার একটি ইন্টেল অ্যাকাউন্ট প্রয়োজন ??? আমার ভুল হতেও পারে??? বলুন ... আমি একটি টিকিট খুলেছি এবং এটি আমার অ্যাকাউন্টে আছে।
dom_beau

আমি আপনাকে ফোরামে যে আলোচনার সাথে নিয়ে যাচ্ছি হতে পারে: সি ++ সংকলক ফোরাম
dom_beau

1

এটি সেন্ডিনেল মান সহ ডিবাগ লাইব্রেরিতে একটি বাগের মতো দেখাচ্ছে I আমি উল্লেখ করা লাইনটি ব্যবহার করে এটি পরীক্ষা করা সহজ:

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

যদি আউটপুট 2 2পরিবর্তে হয় 1 2, তবে সংকলক উপযুক্ত নয় এবং সম্ভবত এখনও এই জাতীয় কেসটিকে একটি ইউবি হিসাবে বিবেচনা করে। কল করার সাথে সাথে এই ক্ষেত্রে ভেন্যুভাবে সেন্টিনেল মান ব্যবহার করা যেতে পারে reset()। পূর্বনির্ধারিত স্ট্যাটিক বাফারের মধ্যে প্ল্যাসমেন্ট নতুন দ্বারা তৈরি করা অবজেক্ট মুছে ফেলার সাথে একই রকম ঘটনা ঘটে, ডিবাগ মোডে এটি সেন্ডিনেল মান সহ কিছু বাস্তবায়ন দ্বারা ওভাররাইট হয়ে যায়।


এটি 64-বিট এবং 32-বিট , ডিবাগ এবং রিলিজ1 2 উভয়ই দেয় ।
dom_beau

2
বাগটি _Ref_count_baseডিফল্ট সিটিওরে রয়েছে যা নির্দিষ্ট করা আছে = default। দুই সদস্য _Uses = 1এবং _Weaks = 1সেট করা হয় 1এবং 0যথাক্রমে। দেখে মনে হচ্ছে ডিফল্ট উত্পন্ন সিটিওরটি বাগড হয়েছে। memoryফাইলটি দেখুন ...
dom_beau

@ ডুম_উউ, এটি একটি প্রতিবেদনের পক্ষে মূল্যবান, এছাড়াও আমরা জানি যে সি ++ তে আদ্যক্ষরকরণ
সুইফট - শুক্রবার পাই
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.