নিরাপদ বন্ধের বাস্তবায়নের জন্য কি আবর্জনা সংগ্রহের প্রয়োজন?


14

আমি সম্প্রতি প্রোগ্রামিং ভাষার একটি অনলাইন কোর্সে অংশ নিয়েছি যেখানে অন্যান্য ধারণাগুলির মধ্যে ক্লোজার উপস্থাপন করা হয়েছিল। আমি আমার প্রশ্ন জিজ্ঞাসার আগে কিছু প্রসঙ্গ দেওয়ার জন্য এই কোর্স দ্বারা অনুপ্রাণিত দুটি উদাহরণ লিখেছি।

প্রথম উদাহরণটি একটি এসএমএল ফাংশন যা 1 থেকে x পর্যন্ত সংখ্যার একটি তালিকা তৈরি করে, যেখানে এক্স ফাংশনের পরামিতি:

fun countup_from1 (x: int) =
    let
        fun count (from: int) =
            if from = x
            then from :: []
            else from :: count (from + 1)
    in
        count 1
    end

এসএমএল REPL এ:

val countup_from1 = fn : int -> int list
- countup_from1 5;
val it = [1,2,3,4,5] : int list

countup_from1ফাংশন সাহায্যকারী অবসান ব্যবহার countকরে যেমনটি এবং পরিবর্তনশীল ব্যবহারসমূহ xতার প্রসঙ্গ থেকে।

দ্বিতীয় উদাহরণে, আমি যখন কোনও ফাংশনটি আহ্বান করি, তখন আমি একটি ফাংশন create_multiplier tফিরে পাই (আসলে, একটি সমাপ্তি) যা তার যুক্তিকে টি দিয়ে বহুগুণ করে:

fun create_multiplier t = fn x => x * t

এসএমএল REPL এ:

- fun create_multiplier t = fn x => x * t;
val create_multiplier = fn : int -> int -> int
- val m = create_multiplier 10;
val m = fn : int -> int
- m 4;
val it = 40 : int
- m 2;
val it = 20 : int

সুতরাং ভেরিয়েবলটি mফাংশন কল দ্বারা ফিরে আসা বন্ধের সাথে আবদ্ধ এবং এখন আমি ইচ্ছামত এটি ব্যবহার করতে পারি।

এখন, ক্লোজারটির পুরো জীবনকাল ধরে সঠিকভাবে কাজ করার জন্য, আমাদের ক্যাপচারড ভেরিয়েবলের জীবনকাল বাড়ানো দরকার t(উদাহরণস্বরূপ এটি একটি পূর্ণসংখ্যা তবে এটি কোনও ধরণের মান হতে পারে)। যতদূর আমি জানি, এসএমএলে এটি আবর্জনা সংগ্রহের মাধ্যমে সম্ভব হয়েছে: বন্ধটি হ'ল বন্দরের মানটির একটি রেফারেন্স রাখে যা পরে আবর্জনা সংগ্রহকারী দ্বারা বন্ধ হয়ে যাওয়ার পরে নিষ্পত্তি করা হয়।

আমার প্রশ্ন: সাধারণভাবে, আবর্জনা সংগ্রহ কি ক্লোজারগুলি নিরাপদ (তাদের পুরো জীবনকালে কলযোগ্য) তা নিশ্চিত করার একমাত্র সম্ভাব্য প্রক্রিয়া?

বা অন্যান্য এমন কী কী ব্যবস্থা আছে যা আবর্জনা সংগ্রহ না করে বন্ধের বৈধতা নিশ্চিত করতে পারে: বন্দী মূল্যবোধগুলি অনুলিপি করুন এবং এটি বন্ধের মধ্যে সংরক্ষণ করুন? বন্ধের জীবনকালকে নিজেই সীমাবদ্ধ রাখুন যাতে এর ক্যাপচারড ভেরিয়েবলগুলি শেষ হয়ে যাওয়ার পরে এটি আর চাওয়া যায় না?

সর্বাধিক জনপ্রিয় পদ্ধতিগুলি কী কী?

সম্পাদনা

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

সম্পূর্ণতার স্বার্থে, এখানে উল্লেখ (এবং পার্শ্ব প্রতিক্রিয়া) ব্যবহার করে অন্য একটি উদাহরণ দেওয়া হয়েছে:

(* Returns a closure containing a counter that is initialized
   to 0 and is incremented by 1 each time the closure is invoked. *)
fun create_counter () =
    let
        (* Create a reference to an integer: allocate the integer
           and let the variable c point to it. *)
        val c = ref 0
    in
        fn () => (c := !c + 1; !c)
    end

(* Create a closure that contains c and increments the value
   referenced by it it each time it is called. *)
val m = create_counter ();

এসএমএল REPL এ:

val create_counter = fn : unit -> unit -> int
val m = fn : unit -> int
- m ();
val it = 1 : int
- m ();
val it = 2 : int
- m ();
val it = 3 : int

সুতরাং, ভেরিয়েবলগুলি রেফারেন্সের মাধ্যমেও ক্যাপচার করা যায় এবং তাদের ( create_counter ()) সম্পন্ন হওয়ার পরে যে ফাংশন কল তৈরি হয়েছিল তার পরেও বেঁচে থাকবে ।


2
ক্লোজ-ওভার থাকা যে কোনও ভেরিয়েবলগুলি আবর্জনা সংগ্রহের হাত থেকে রক্ষা করা উচিত এবং যে কোনও ভেরিয়েবলগুলি বন্ধ না হওয়াগুলি আবর্জনা সংগ্রহের জন্য যোগ্য হতে হবে। এটি অনুসরণ করে যে কোনও প্রক্রিয়া যা ভেরিয়েবল বন্ধ রয়েছে কিনা তা নির্ভরযোগ্যভাবে ট্র্যাক করতে পারে এবং পরিবর্তনশীল অধিষ্ঠিত মেমরিটিকেও নির্ভরযোগ্যভাবে দাবি করতে পারে।
রবার্ট হার্ভে

3
@ বাটিলি: আবর্জনা সংগ্রহকারীদের জন্য রিফকাউন্টিং হ'ল বিভিন্ন বাস্তবায়ন কৌশলগুলির মধ্যে একটি। এই প্রশ্নের প্রয়োজনে কীভাবে জিসি বাস্তবায়িত হয় তা বিবেচ্য নয়।
জার্গ ডব্লু মিটাগ

3
@ বাটলি: "সত্য" আবর্জনা সংগ্রহের অর্থ কী? জিসি বাস্তবায়নের আরেকটি উপায় রিফকাউন্টিং। ট্র্যাকিং বেশি জনপ্রিয়, সম্ভবত পুনরায় গণনা সহ চক্র সংগ্রহের অসুবিধার কারণে। (সাধারণত, আপনি যাইহোক যাইহোক একটি পৃথক ট্রেসিং জিসি দিয়ে শেষ করেন, সুতরাং আপনি যদি একটির সাথে যোগাযোগ করতে পারেন তবে দুটি জিসি বাস্তবায়নে বিরক্ত করবেন কেন) তবে চক্রের সাথে আচরণ করার অন্যান্য উপায়ও রয়েছে। 1) কেবল তাদের নিষেধ করুন। 2) কেবল তাদের উপেক্ষা করুন। (আপনি যদি দ্রুত ওয়ান-অফ স্ক্রিপ্টগুলির জন্য একটি বাস্তবায়ন করছেন, তবে কেন নয়?) 3) এগুলি স্পষ্টভাবে সনাক্ত করার চেষ্টা করুন। (এটি প্রমাণিত হয়েছে যে পুনরায় হিসাব পাওয়া গেলে তা আরও দ্রুত গতিতে পারে))
জার্গ ডব্লু মিটাগ

1
আপনি কেন প্রথম স্থানে ক্লোজার চান তা এটি নির্ভর করে। আপনি যদি একটি পূর্ণ ল্যাম্বডা ক্যালকুলাস শব্দার্থক প্রয়োগ করতে চান তবে অবশ্যই আপনার অবশ্যই জিসি, পিরিয়ড দরকার । আশেপাশে আর কোনও উপায় নেই। যদি আপনি এমন কিছু চান যা ঘনিষ্ঠভাবে ক্লোজারগুলির সাথে সাদৃশ্যযুক্ত, তবে যেমন (সি ++, ডেলফি, যাই হোক না কেন) এর সঠিক শব্দার্থবিজ্ঞান অনুসরণ না করে - আপনি যা চান তা করুন, অঞ্চল বিশ্লেষণ ব্যবহার করুন, পুরোপুরি ম্যানুয়াল মেমরি পরিচালনা ব্যবহার করুন।
এসকে-যুক্তি

2
@ ম্যাসন হুইলারের: বন্ধগুলি কেবলমাত্র মান, সাধারণভাবে রানটাইমে কীভাবে এগুলি স্থানান্তরিত করা হবে তা অনুমান করা যায় না। এই অর্থে, এগুলি বিশেষ কিছু নয়, স্ট্রিং, একটি তালিকা ইত্যাদির জন্য একই হবে।
জর্জিও

উত্তর:


14

জাস্ট প্রোগ্রামিং ভাষা এই দিকটি আকর্ষণীয়।

মরিচা একটি সিস্টেম ভাষা, একটি languageচ্ছিক জিসি সহ, এবং প্রথম থেকেই ক্লোজার দিয়ে ডিজাইন করা হয়েছিল ।

অন্যান্য ভেরিয়েবল হিসাবে মরিচা বন্ধগুলি বিভিন্ন স্বাদে আসে। স্ট্যাক ক্লোজার , সর্বাধিক সাধারণ, এক শট ব্যবহারের জন্য। তারা স্ট্যাকের উপরে বাস করে এবং যে কোনও কিছু উল্লেখ করতে পারে। মালিকানাধীন বন্ধ হওয়া ক্যাপচারড ভেরিয়েবলগুলির মালিকানা গ্রহণ করে। আমি মনে করি তারা তথাকথিত "এক্সচেঞ্জ হিপ" এ বাস করে, যা একটি বৈশ্বিক স্তূপ। কে তাদের মালিক তার উপর তাদের জীবনকাল নির্ভর করে। পরিচালিত ক্লোজারগুলি টাস্ক-লোকাল হিপগুলিতে লাইভ থাকে এবং এটিকে টাস্কের জিসি দ্বারা অনুসরণ করা হয়। যদিও তাদের ক্যাপচারিং সীমাবদ্ধতা সম্পর্কে আমি নিশ্চিত নই।


1
মরিচা ভাষার খুব আকর্ষণীয় লিঙ্ক এবং রেফারেন্স। ধন্যবাদ। +1 টি।
জর্জিও

1
উত্তর গ্রহণের আগে আমি অনেক কিছু ভেবেছিলাম কারণ আমি ম্যাসনের উত্তরটিও খুব তথ্যবহুল বলে মনে করি। আমি এটিকে বেছে নিয়েছি কারণ এটি উভয় তথ্যবহুল এবং এটি বন্ধের একটি মূল পদ্ধতির সাথে কম জ্ঞাত ভাষার উদ্ধৃতি দেয়।
জর্জিও

তার জন্য ধন্যবাদ. আমি এই তরুণ ভাষা সম্পর্কে খুব উত্সাহী, এবং আমি আমার আগ্রহ ভাগ করে নিয়ে আনন্দিত am আমি জানতাম না জাস্টের কথা শুনে আগে জিসি ছাড়া ওয়েটার নিরাপদ বন্ধ হওয়া সম্ভব ছিল।
বরজাক

9

দুর্ভাগ্যক্রমে একটি জিসি দিয়ে শুরু করা আপনাকে এক্সওয়াই সিন্ড্রোমের শিকার করে তোলে:

  • ক্লোজারগুলি যতক্ষণ বন্ধ হয়ে যায় ততক্ষণ লাইভে তাদের বন্ধ হওয়া পরিবর্তনশীলগুলির চেয়ে প্রয়োজনীয় (সুরক্ষার কারণে)
  • জিসি ব্যবহার করে আমরা সেই ভেরিয়েবলগুলির জীবনকাল দীর্ঘায়িত করতে পারি
  • এক্সওয়াই সিনড্রোম: আজীবন প্রসারিত করার জন্য কি অন্য কোনও ব্যবস্থা আছে?

দ্রষ্টব্য, তবে, কোনও পরিবর্তনকের আজীবন সময় বাড়ানোর ধারণার চেয়ে বন্ধ করার জন্য প্রয়োজনীয় নয় ; এটি সবেমাত্র জিসি দ্বারা এনেছে; আসল সুরক্ষা বিবৃতিটি হ'ল বন্ধ ওভার ভেরিয়েবলগুলি যতক্ষণ বন্ধ হওয়া অবধি বেঁচে থাকা উচিত (এবং এটিও নড়বড়ে, আমরা বলতে পারি যে তারা বন্ধের শেষ আহ্বানের পরেও বেঁচে থাকতে পারে)।

মূলত দুটি দৃষ্টিভঙ্গি আমি দেখতে পাচ্ছি (এবং তারা সম্ভাব্যভাবে একত্রিত হতে পারে):

  1. বদ্ধ ওভার ভেরিয়েবলগুলির আজীবন প্রসারিত করুন (যেমন একটি জিসি করেন, উদাহরণস্বরূপ)
  2. বন্ধের আজীবন সীমাবদ্ধ করুন

পরেরটি কেবল একটি প্রতিসম পন্থা। এটি প্রায়শই ব্যবহৃত হয় না, তবে যদি মরিচা মত আপনার যদি একটি অঞ্চল-সচেতন টাইপ সিস্টেম থাকে তবে অবশ্যই এটি সম্ভব।


7

মান দ্বারা পরিবর্তনশীল ক্যাপচার করার সময় নিরাপদ বন্ধের জন্য আবর্জনা সংগ্রহের প্রয়োজন হয় না needed এর একটি বিশিষ্ট উদাহরণ হ'ল সি ++। সি ++ এর কোনও মানক আবর্জনা সংগ্রহ নেই। সি ++ 11 এ ল্যাম্বডাস ক্লোজার (তারা পার্শ্ববর্তী সুযোগ থেকে স্থানীয় ভেরিয়েবলগুলি ক্যাপচার করে)। ল্যাম্বডায় ক্যাপচারিত প্রতিটি ভেরিয়েবল মান বা রেফারেন্স দ্বারা ক্যাপচারের জন্য নির্দিষ্ট করা যেতে পারে। যদি এটি রেফারেন্স দ্বারা ক্যাপচার করা হয়, তবে আপনি বলতে পারেন যে এটি নিরাপদ নয়। যাইহোক, যদি কোনও ভেরিয়েবল মান দ্বারা ক্যাপচার করা হয়, তবে এটি নিরাপদ, কারণ ক্যাপচারিত অনুলিপি এবং মূল পরিবর্তনশীল পৃথক এবং স্বতন্ত্র লাইফটাইম থাকে have

আপনার দেওয়া এসএমএলের উদাহরণে, এটি ব্যাখ্যা করা সহজ: ভেরিয়েবলগুলি মান দ্বারা ক্যাপচার হয়। কোনও ভেরিয়েবলের "জীবনকাল বাড়ানোর" দরকার নেই কারণ আপনি কেবলমাত্র এর মানটি ক্লোজারে অনুলিপি করতে পারেন। এটি সম্ভব, কারণ এমএল-তে ভেরিয়েবলগুলি বরাদ্দ করা যায় না। সুতরাং একটি অনুলিপি এবং অনেক স্বতন্ত্র অনুলিপি মধ্যে পার্থক্য নেই। যদিও এসএমএলে আবর্জনা সংগ্রহ রয়েছে তবে এটি বন্ধ হয়ে ভেরিয়েবল ক্যাপচারের সাথে সম্পর্কিত নয়।

রেফারেন্স (ধরণের) দ্বারা ভেরিয়েবল ক্যাপচার করার সময় নিরাপদ বন্ধের জন্য আবর্জনা সংগ্রহেরও প্রয়োজন হয় না। একটি উদাহরণ হ'ল অ্যাপল ব্লকগুলি সি, সি ++, অবজেক্টিভ-সি, এবং অবজেক্টিভ-সি ++ ভাষায় এক্সটেনশন। সি এবং সি ++ তে কোনও মানক আবর্জনা সংগ্রহ নেই। ব্লকগুলি ডিফল্টরূপে মান দ্বারা ভেরিয়েবল ক্যাপচার করে। তবে, যদি স্থানীয় ভেরিয়েবলের সাথে ঘোষিত হয় __block, তবে ব্লকগুলি এগুলিকে "রেফারেন্স দ্বারা" বলে মনে হয়, এবং তারা নিরাপদ - এগুলি ব্লকটি সংজ্ঞায়িত করার সুযোগের পরেও ব্যবহার করা যেতে পারে What এখানে কী ঘটে তা হ'ল __blockভেরিয়েবলগুলি আসলে একটি বিশেষ কাঠামোর নীচে, এবং যখন ব্লকগুলি অনুলিপি করা হয় (এগুলি প্রথমে স্কোপের বাইরে ব্যবহার করার জন্য ব্লকগুলি অবশ্যই অনুলিপি করতে হবে), তারা কাঠামোগুলি "সরান"__block হিপগুলিতে পরিবর্তনশীল, এবং ব্লকটি এর স্মৃতি পরিচালনা করে, আমি রেফারেন্স গণনার মাধ্যমে বিশ্বাস করি।


4
"বন্ধের জন্য আবর্জনা সংগ্রহের প্রয়োজন হয় না" ": ভাষাটি নিরাপদ বন্ধকরণ কার্যকর করতে পারে যাতে এটির দরকার হয় কিনা তা প্রশ্ন। আমি জানি যে আমি সি ++ এ নিরাপদ বন্ধ লিখতে পারি তবে ভাষা সেগুলি প্রয়োগ করে না। ক্যাপচারড ভেরিয়েবলগুলির আজীবন প্রসারিত ক্লোজারগুলির জন্য, আমার প্রশ্নের সম্পাদনা দেখুন।
জর্জিও

1
আমি মনে করি যে প্রশ্নটি উত্তর দেওয়া যেতে পারে: নিরাপদ বন্ধের জন্য
ম্যাথিউ এম।

1
শিরোনামটিতে "নিরাপদ বন্ধ" শব্দটি রয়েছে, আপনি কি মনে করেন যে আমি এটিকে আরও ভালভাবে প্রণয়ন করতে পারি?
জর্জিও

1
আপনি দয়া করে দ্বিতীয় অনুচ্ছেদটি সংশোধন করতে পারেন? এসএমএলে ক্লোজারগুলি ডেটা আজীবন প্রসারিত করে যা ক্যাপচারড ভেরিয়েবলগুলি উল্লেখ করে। এছাড়াও, এটি সত্য যে আপনি ভেরিয়েবল বরাদ্দ করতে পারবেন না (তাদের বাইন্ডিং পরিবর্তন করুন) তবে আপনার কাছে পারস্পরিক পরিবর্তনযোগ্য ডেটা রয়েছে (এর মাধ্যমে ref)। সুতরাং, ঠিক আছে, কেউ ক্লোজারগুলির বাস্তবায়ন আবর্জনা সংগ্রহের সাথে সম্পর্কিত কিনা তা নিয়ে বিতর্ক করতে পারে তবে উপরের বিবৃতিগুলি সংশোধন করা উচিত।
জর্জিও

1
@ জর্জিও: এখন কেমন? এছাড়াও, কোন অর্থে আপনি আমার বক্তব্যটি খুঁজে পেয়েছেন যে বন্ধ হওয়ার কারণে কোনও ক্যাপচারড ভেরিয়েবলের জীবনকাল বাড়ানো দরকার না? আপনি যখন পরিবর্তনীয় ডেটা সম্পর্কে কথা বলছেন, আপনি কোনও রেফারেন্স টাইপ ( refগুলি, অ্যারে, ইত্যাদি) সম্পর্কে কথা বলছেন যা কোনও কাঠামোর দিকে নির্দেশ করে। তবে মানটি হ'ল রেফারেন্স, এটি নির্দেশ করে এমন জিনিস নয়। যদি আপনার কাছে থাকে var a = ref 1এবং আপনি একটি অনুলিপি তৈরি করেন var b = aএবং আপনি ব্যবহার করেন b, তার মানে কি আপনি এখনও ব্যবহার করছেন a? না। হ্যাঁ, আপনি একই কাঠামোটিতে ইঙ্গিত করেছেন a?
এসএমএলে এই ধরণেরগুলি

6

বন্ধগুলি বাস্তবায়নের জন্য আবর্জনা সংগ্রহের প্রয়োজন হয় না। ২০০৮ সালে, ডেল্ফি ভাষা, যা আবর্জনা সংগ্রহ করা হয় না, এটি ক্লোজারগুলির বাস্তবায়ন যুক্ত করে। এটি এর মতো কাজ করে:

সংকলকটি হুডের নীচে একটি ফান্টর অবজেক্ট তৈরি করে যা কোনও বন্ধের প্রতিনিধিত্বকারী একটি ইন্টারফেস প্রয়োগ করে। সমস্ত ক্লোড-ওভার স্থানীয় ভেরিয়েবলগুলি স্থানীয়দের থেকে বিড়াল প্রক্রিয়াটির জন্য ফান্টারের অবজেক্টের ক্ষেত্রগুলিতে পরিবর্তিত হয়। এটি নিশ্চিত করে যে ফ্যান্টার যতক্ষণ রাজ্য সংরক্ষণ করা হয়।

এই ব্যবস্থার সীমাবদ্ধতা হ'ল এনকোলেজিং ফাংশন, তেমনি ফাংশনটির ফলাফলের মান হিসাবে কোনও পরামিতি পাস করা হয়েছে, ফান্টারের দ্বারা ক্যাপচার করা যাবে না কারণ তারা স্থানীয় নয় যার পরিধিটি ঘের কার্যকারিতা সীমাবদ্ধ।

বিকাশকারীটিকে ইন্টারফেসের পরিবর্তে ফাংশন পয়েন্টারের মতো বিকাশকারীর দিকে নজর দেওয়ার জন্য সিনট্যাকটিক চিনি ব্যবহার করে ক্লোজার রেফারেন্স দ্বারা উল্লেখ করা হয়। এটি ইন্টারফেসের জন্য ডেলফির রেফারেন্স-কাউন্টিং সিস্টেমটি ব্যবহার করে যাতে এটি নিশ্চিত করা যায় যে ফান্টার অবজেক্ট (এবং এটি যে সমস্ত রাজ্য এটি ধারণ করে) যতক্ষণ তার প্রয়োজন হবে ততক্ষণ "জীবিত" থাকবে এবং তারপরে রিফ্যাক্টটি 0 এ নামলে এটি মুক্ত হয়।


1
আহ, সুতরাং কেবল স্থানীয় পরিবর্তনশীল ক্যাপচার করা সম্ভব, তর্কগুলি নয়! এটি একটি যুক্তিসঙ্গত এবং চতুর বাণিজ্য বন্ধ বলে মনে হচ্ছে! +1
জর্জিও

1
@Giorgio: এটা আর্গুমেন্ট শুধু না বেশী যে হয় ক্যাপচার করতে পারেন Var প্যারামিটার।
ম্যাসন হুইলার 0

2
আপনি ভাগ করে নেওয়া ব্যক্তিগত রাষ্ট্রের মাধ্যমে যোগাযোগ করেন এমন 2 টি ক্লোজার থাকার ক্ষমতাও হারাবেন। বেসিক ব্যবহারের ক্ষেত্রে আপনি এটির মুখোমুখি হবেন না, তবে এটি জটিল স্টাফ করার ক্ষমতা সীমাবদ্ধ করে। তবুও কী সম্ভব তার দুর্দান্ত উদাহরণ!
btilly

3
@ বাটলি: আসলে, যদি আপনি একই বদ্ধ কর্মের ভিতরে 2 টি ক্লোজার রাখেন, তবে এটি পুরোপুরি আইনী। তারা একই ফান্টর অবজেক্টটি ভাগ করে নেবে এবং যদি তারা একে অপরের মতো একই স্থিতি পরিবর্তন করে তবে একটিতে অন্যের পরিবর্তন প্রতিফলিত হবে।
ম্যাসন হুইলার

2
@ মেসনওহিলার: "নং আবর্জনা সংগ্রহ প্রকৃতিবিরোধী নয়; যে কোনও বস্তু কখনই সংগ্রহ করা হবে তার কোনও গ্যারান্টি নেই, যা ঘটবে তা একা ছেড়ে দিন But তবে রেফারেন্স গণনাটি হ'ল নির্দোষ: বস্তুর সংকলক আপনাকে গ্যারান্টিযুক্ত গণনা কমে যাওয়ার সাথে সাথেই মুক্ত করা হবে ""। প্রতিবারের জন্য যদি আমার কাছে একটি ডাইম থাকে তবে আমি শুনি যে এই রূপকথাটি স্থায়ী। ওসিএএমএলের একটি ডিস্ট্রিমেন্টিক জিসি রয়েছে। সি ++ থ্রেড নিরাপদ shared_ptrঅ-নিরস্তামূলক কারণ কারণ ধ্বংসকারীরা শূন্যে হ্রাসের প্রতিযোগিতা করে।
জন হ্যারোপ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.