স্মার্ট পয়েন্টার: বস্তুর মালিক কে? [বন্ধ]


114

সি ++ সবই মেমরির মালিকানা সম্পর্কিত - ওরফে মালিকানা শব্দার্থক

সেই স্মৃতিটি প্রকাশের জন্য গতিশীলভাবে বরাদ্দ হওয়া মেমরির একটি অংশের মালিকের দায়িত্ব। সুতরাং প্রশ্নটি সত্যই হয়ে যায় মেমরিটির মালিক কে।

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

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

সুতরাং প্রশ্ন:

  • লোকেরা কী ধরণের মালিকানা উপস্থাপন করেছে?
  • এই শব্দার্থক প্রয়োগ করতে কোন স্ট্যান্ডার্ড ক্লাস ব্যবহার করা হয়?
  • কোন পরিস্থিতিতে আপনি তাদের দরকারী মনে করেন?

প্রতি উত্তরে 1 ধরণের অর্থপূর্ণ মালিকানা রাখুন যাতে তাদের আলাদা আলাদাভাবে ভোট দেওয়া যায়।

সারসংক্ষেপ:

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

std::auto_ptr<T>:

একক ব্যক্তি অবজেক্টের মালিক। মালিকানা হস্তান্তর অনুমোদিত।

ব্যবহার: এটি আপনাকে ইন্টারফেসগুলি সংজ্ঞায়িত করতে দেয় যা স্বত্বের সুস্পষ্ট স্থানান্তর দেখায়।

boost::scoped_ptr<T>

একক ব্যক্তি অবজেক্টের মালিক। মালিকানা হস্তান্তর অনুমোদিত নয়।

ব্যবহার: সুস্পষ্ট মালিকানা দেখানোর জন্য ব্যবহৃত হয়। অবজেক্টটি ডেস্ট্রাক্টর দ্বারা বা স্পষ্টভাবে পুনরায় সেট করার পরে ধ্বংস হয়ে যাবে।

boost::shared_ptr<T>( std::tr1::shared_ptr<T>)

একাধিক মালিকানা। এটি একটি সাধারণ রেফারেন্স গণনা পয়েন্টার। রেফারেন্স গণনা শূন্যে পৌঁছে গেলে বস্তুটি ধ্বংস হয়ে যায়।

ব্যবহার: যখন কোনও বস্তুর আজীবন একাধিক owণ থাকতে পারে যা সংকলনের সময় নির্ধারণ করা যায় না।

boost::weak_ptr<T>:

shared_ptr<T>পয়েন্টারগুলির একটি চক্র ঘটতে পারে এমন পরিস্থিতিতে ব্যবহৃত হয়।

ব্যবহার: যখন কেবল চক্রটি একটি ভাগ করা পুনরায় হিসাব বজায় রাখে তখন অবৈধ জিনিসগুলি ধরে রাখতে চক্র বন্ধ করতে ব্যবহৃত হয়।


14
?? প্রশ্নটি কি ছিল?
পেসারিয়ার

9
আমি কেবল এটিই উল্লেখ করতে চেয়েছিলাম যেহেতু এই প্রশ্নটি পোস্ট করা হয়েছিল অটো_পিটারটি (এখনকার স্ট্যান্ডার্ডাইজড) অনন্য_পিতারের পক্ষে অবমূল্যায়ন করা হয়েছে
জুয়ান ক্যাম্পা

In C++ ownership is documented by the type a RAW pointer is wrapped inside thus in a good (IMO) এটি কি পুনরায় চাপানো যেতে পারে? আমি মোটেই বুঝতে পারি না।
lolololol ওল

@lololololol আপনি বাক্যটি অর্ধেক কেটেছেন। In C++ ownership is documented by the type a RAW pointer is wrapped inside thus in a good C++ program it is very rare to see RAW pointers passed around। RAW পয়েন্টারগুলির মালিকানা শব্দার্থবিজ্ঞান নেই। আপনি যদি মালিককে না চেনেন তবে অবজেক্টটি মোছার জন্য দায়ী কে তা আপনি জানেন না here এমন অনেকগুলি মানক শ্রেণি রয়েছে যা পয়েন্টারগুলিকে আবদ্ধ করতে ব্যবহৃত হয় (এসটিডি: শেয়ারড_পিটার, এসটিডি :: অনন্য_পিটার ইত্যাদি) যা মালিকানা নির্ধারণ করে এবং এভাবে নির্দেশক মোছার জন্য দায়ী কে নির্ধারণ করুন।
মার্টিন ইয়র্ক

1
সি ++ এ + + অটো_পিটার ব্যবহার করবেন না! পরিবর্তে অনন্য_পিটার ব্যবহার করুন!
বলছে পুনরায় ইনস্টল করুন মনিকা

উত্তর:


20

আমার জন্য, এই 3 ধরণের আমার বেশিরভাগ চাহিদা আবরণ করে:

shared_ptr - রেফারেন্স-গণনা করা, কাউন্টারের শূন্যে পৌঁছালে অবনমন ation

weak_ptr- উপরের মতো একই, তবে এটি shared_ptrকোনওর জন্য 'দাস' , হ্রাস করতে পারে না

auto_ptr- যখন সৃষ্টি এবং বিলোপ একই ফাংশনের অভ্যন্তরে ঘটে থাকে বা যখন কোনও বিষয়টিকে কেবলমাত্র এক-মালিক হিসাবে বিবেচনা করতে হয়। আপনি যখন অন্যটির জন্য একটি পয়েন্টার বরাদ্দ করেন, দ্বিতীয়টি প্রথম থেকে অবজেক্টটিকে 'চুরি করে'।

এগুলির জন্য আমার নিজস্ব বাস্তবায়ন রয়েছে তবে সেগুলি এগুলিতে উপলব্ধ Boost

আমি এখনও রেফারেন্সের মাধ্যমে অবজেক্টগুলি পাস করি ( constযখনই সম্ভব) এই ক্ষেত্রে ডাকা পদ্ধতিটি অবশ্যই কল করার সময় অবশ্যই অবজেক্টটি জীবিত রয়েছে বলে ধরে নিতে হবে।

এখানে অন্য ধরণের পয়েন্টার রয়েছে যা আমি হাব_প্টারকে কল করি । এটি যখন আপনার কোনও বস্তু থাকে যা অবশ্যই এতে নেস্ট করা জিনিসগুলি থেকে অ্যাক্সেসযোগ্য হতে পারে (সাধারণত ভার্চুয়াল বেস শ্রেণি হিসাবে)। এটি weak_ptrতাদের কাছে পাস করার মাধ্যমে সমাধান করা যেতে পারে , তবে এটির নিজের কাছে এটি নেই shared_ptr। যেহেতু এটি জানে যে এই জিনিসগুলি তার চেয়ে বেশি দিন বাঁচতে পারে না, এটি তাদের কাছে একটি হাব_প্ট্র পাস করে (এটি নিয়মিত পয়েন্টারে কেবল একটি টেম্পলেট মোড়ক)।


2
আপনার নিজস্ব পয়েন্টার শ্রেণি (hub_ptr) তৈরি করার পরিবর্তে আপনি কেন এই বিষয়গুলিতে * এটি পাস করেন না এবং এটিকে এটি একটি রেফারেন্স হিসাবে সঞ্চয় করতে দেন না? যেহেতু আপনি এমনকি স্বীকার করেছেন যে মালিকানাধীন শ্রেণি হিসাবে একই সাথে অবজেক্টগুলি ধ্বংস হয়ে যাবে, তাই আমি এতগুলি হুপের মধ্য দিয়ে লাফানোর বিন্দুটি বুঝতে পারি না।
মিশেল

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

1
এছাড়াও মনে রাখবেন যে আপনি #ifdefs করতে হাব_সিপিটি রিলিজ বিল্ডগুলিতে নগ্ন পয়েন্টারে টাইপডফ করতে পারেন, সুতরাং ওভারহেড কেবল ডিবাগ বিল্ডে উপস্থিত থাকবে।
ফ্যাবিও সেকোনলো

3
নোট করুন যে বুস্ট ডকুমেন্টেশনগুলি স্কোপড_পিটারের বিবরণটির সাথে স্ববিরোধী। এতে বলা হয়েছে যে এটি রয়েছে noncopyableএবং মালিকানা স্থানান্তরিত হতে পারে না।
অ্যালেক থমাস

3
অ্যালেক থমাস, আপনি ঠিক বলেছেন। আমি অটো_পিটার নিয়ে ভাবছিলাম এবং স্কোপড_পিটার লিখেছিলাম। সংশোধন।
ফ্যাবিও সেকোনলো

23

সাধারণ সি ++ মডেল

বেশিরভাগ মডিউলগুলিতে আমি দেখেছি, ডিফল্টরূপে, ধরে নেওয়া হয়েছিল যে পয়েন্টারগুলি গ্রহণ করা মালিকানা পাচ্ছে না । প্রকৃতপক্ষে, পয়েন্টারের মালিকানা ত্যাগ করা কার্য / পদ্ধতিগুলি উভয়ই খুব বিরল এবং স্পষ্টভাবে তাদের ডকুমেন্টেশনে সেই সত্যটি প্রকাশ করেছিল।

এই মডেল ধরে নিয়েছে যে ব্যবহারকারী কেবলমাত্র তার স্পষ্টত যা বরাদ্দ করেছে তারই মালিক । অন্য সমস্ত কিছু স্বয়ংক্রিয়ভাবে নিষ্পত্তি হয় (স্কোপ প্রস্থান থেকে, বা আরআইআইআইয়ের মাধ্যমে)। এটি একটি সি-এর মতো মডেল, বেশিরভাগ পয়েন্টারগুলির মালিকানা এমন বস্তুর মালিক যা এগুলি স্বয়ংক্রিয়ভাবে হ্রাস পাবে বা যখন প্রয়োজন হবে (অবজেক্টগুলির ধ্বংস, বেশিরভাগ ক্ষেত্রে) এবং অবজেক্টের আয়ু সময়কাল অনুমানযোগ্য (RAII আপনার বন্ধু, আবার)।

এই মডেলটিতে কাঁচা পয়েন্টারগুলি অবাধে চলাচল করে এবং বেশিরভাগই বিপজ্জনক নয় (তবে যদি বিকাশকারী যথেষ্ট স্মার্ট হয় তবে সে যখনই সম্ভব হবে তার পরিবর্তে রেফারেন্স ব্যবহার করবে)।

  • কাঁচা পয়েন্টার
  • এসটিডি :: auto_ptr
  • বুস্ট :: scoped_ptr

স্মার্ট পয়েন্টেড সি ++ মডেল

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

  • বুস্ট :: shared_ptr
  • বুস্ট :: weak_ptr

উপসংহার

আমি যে মডেলগুলি বর্ণনা করি তা বিবেচনাধীন, ব্যতিক্রম ছাড়া পয়েন্টার প্রাপ্তি তার মালিকানা পাচ্ছে না এবং কে কার মালিক তা এখনও জানা খুব গুরুত্বপূর্ণ । এমনকি সি ++ কোডের জন্য খুব বেশি রেফারেন্স এবং / অথবা স্মার্ট পয়েন্টার ব্যবহার করে।


10

ভাগ করে নেওয়া মালিকানা নেই। যদি আপনি এটি করেন তবে তা নিয়ন্ত্রণ করুন এমন কোডের সাথেই তা নিশ্চিত করুন।

এটি 100% সমস্যার সমাধান করে, যেহেতু এটি আপনাকে সবকিছু কীভাবে ইন্টারেক্ট করে তা বুঝতে বাধ্য করে।


2
  • অংশিদারী মালিকানা
  • বুস্ট :: shared_ptr

যখন কোনও সংস্থান একাধিক বস্তুর মধ্যে ভাগ করা হয়। বুস্ট শেয়ারড_পিটার প্রত্যেকে সমাপ্ত করার সময় রিসোর্সটি ডি-বরাদ্দ করা হয়েছে তা নিশ্চিত করতে রেফারেন্স গণনা ব্যবহার করে।


2

std::tr1::shared_ptr<Blah> প্রায়শই আপনার সেরা বাজি হয়।


2
শেয়ারড_পিটার সবচেয়ে সাধারণ। তবে আরও অনেক কিছু রয়েছে। প্রত্যেকের নিজস্ব ব্যবহারের ধরণ এবং মামলা করার জন্য ভাল এবং খারাপ জায়গা রয়েছে। আরও কিছু বিবরণ সুন্দর হবে।
মার্টিন ইয়র্ক

আপনি যদি কোনও পুরনো সংকলকের সাথে আটকে থাকেন তবে বুস্ট :: শেয়ার্ড_পিটার <ব্লাহ> যা স্ট্যান্ডার্ড :: ট্র 1 :: শেয়ারড_পিটার <ব্লাহ> ভিত্তিক। এটি একটি সহজ পর্যাপ্ত শ্রেণি যা আপনি সম্ভবত এটি বুস্ট থেকে ছিঁড়ে ফেলতে পারেন এবং এটি ব্যবহার করতে পারেন এমনকি আপনার সংকলক বুস্টের সর্বশেষতম সংস্করণ দ্বারা সমর্থিত না হলেও।
ব্রানান

2

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

উইন্ডোজে সিওএম পয়েন্টার রয়েছে (আইইউএনএনডেড, আইডিস্প্যাচ, এবং ফ্রেন্ডস) এবং তাদের পরিচালনা করার জন্য বিভিন্ন স্মার্ট পয়েন্টার রয়েছে (যেমন এটিএলস এর সিকমপিআরটি এবং স্মার্ট পয়েন্টারগুলি স্বয়ংক্রিয়ভাবে জেনারেল _ কম_পিটার শ্রেণির উপর ভিত্তি করে ভিজ্যুয়াল স্টুডিওতে "আমদানি" বিবৃতি দ্বারা উত্পন্ন )।


1
  • এক মালিক
  • বুস্ট :: scoped_ptr

আপনার যখন গতিশীল মেমরি বরাদ্দ করতে হয় তবে নিশ্চিত হন যে এটি ব্লকের প্রতিটি প্রস্থান পয়েন্টে অবনমিত হয়।

আমি সহজেই এটি পুনরায় তৈরি করা যেতে পারে এবং কোনও ফুটো সম্পর্কে চিন্তা না করে ছেড়ে দেওয়া যেতে পারে বলে আমি এই দরকারী use


1

আমি মনে করি না যে আমি কখনই আমার ডিজাইনে ভাগ করে নেওয়ার মতো অবস্থানে ছিলাম। প্রকৃতপক্ষে, আমার মাথার শীর্ষ থেকে কেবলমাত্র বৈধ ক্ষেত্রেই আমি ফ্লাইওয়েট প্যাটার্নটি ভাবতে পারি।


1

ইয়াস্পার :: পিটিআর হ'ল লাইটওয়েট, বুস্ট :: শেয়ারড_পিটার বিকল্পের মতো। এটি আমার (আপাতত) ছোট প্রকল্পে ভাল কাজ করে।

Http://yasper.sourceforge.net/ এ ওয়েব পৃষ্ঠায় এটি নীচে বর্ণিত:

কেন অন্য একটি সি ++ স্মার্ট পয়েন্টার লিখুন? সি ++ এর জন্য ইতিমধ্যে বেশ কয়েকটি উচ্চ মানের স্মার্ট পয়েন্টার বাস্তবায়ন বিদ্যমান রয়েছে, সর্বাধিক সুস্পষ্টভাবে বুস্ট পয়েন্টার পান্থিয়ন এবং লোকির স্মার্টপ্রিট। স্মার্ট পয়েন্টার বাস্তবায়নগুলির ভাল তুলনার জন্য এবং যখন তাদের ব্যবহার যথাযথ হয় দয়া করে হার্ব সটারের নতুন সি ++: স্মার্ট (এর) পয়েন্টারগুলি পড়ুন। অন্যান্য গ্রন্থাগারের বিস্তৃত বৈশিষ্ট্যগুলির বিপরীতে, ইয়াস্পার হ'ল সংকীর্ণভাবে উল্লেখযোগ্য রেফারেন্স গণনা পয়েন্টার। এটি বুস্টের শেয়ার্ড_পিটার এবং লোকির রেফকাউন্ট / অ্যালভো কনভার্সন নীতিগুলির সাথে ঘনিষ্ঠভাবে মিলযুক্ত। ইয়াস্পার বুস্টের বৃহত নির্ভরতা প্রবর্তন না করা বা লোকির জটিল নীতি সংক্রান্ত টেমপ্লেটগুলি সম্পর্কে জানতে না পেরে সি ++ প্রোগ্রামারদের মেমরি পরিচালনা সম্পর্কে ভুলে যাওয়ার অনুমতি দেয়। দর্শন

* small (contained in single header)
* simple (nothing fancy in the code, easy to understand)
* maximum compatibility (drop in replacement for dumb pointers)

শেষ পয়েন্টটি বিপজ্জনক হতে পারে, যেহেতু ইয়াস্পার ঝুঁকিপূর্ণ (এখনও দরকারী) ক্রিয়াকলাপের অনুমতি দেয় (যেমন কাঁচা পয়েন্টারগুলিতে অ্যাসাইনমেন্ট এবং ম্যানুয়াল রিলিজ) অন্যান্য প্রয়োগের দ্বারা অনুমোদিত নয়। সাবধানতা অবলম্বন করুন, আপনি কী করছেন তা যদি আপনি জানেন তবে কেবল সেই বৈশিষ্ট্যগুলি ব্যবহার করুন!


1

একক-স্থানান্তরযোগ্য-মালিকের আরও একটি ঘন ঘন ব্যবহৃত ফর্ম রয়েছে এবং এটি কার্যকরী auto_ptrকারণ এটি auto_ptrকার্যনির্বাহী শব্দার্থবিজ্ঞানের উন্মাদ দুর্নীতির ফলে সৃষ্ট সমস্যাগুলি এড়িয়ে চলে ।

আমি ছাড়া অন্য কারও কথা বলি না swap। উপযুক্ত swapফাংশন সহ যে কোনও ধরণের স্মার্ট রেফারেন্স হিসাবে ধারণা করা যেতে পারে কিছু বিষয়বস্তুর , যা মালিকানা একই ধরণের অন্য কোনও উদাহরণে স্থানান্তরিত না হওয়া অবধি অবধি অদলবদল করে until প্রতিটি উদাহরণ তার পরিচয় ধরে রাখে তবে নতুন সামগ্রীতে আবদ্ধ হয়। এটি নিরাপদে প্রত্যাবর্তনযোগ্য রেফারেন্সের মতো।

(এটি একটি স্মার্ট পয়েন্টারের চেয়ে স্মার্ট রেফারেন্স কারণ আপনাকে সামগ্রীটিতে উপস্থিত হওয়ার জন্য এটি স্পষ্টভাবে অবহেলা করতে হবে না))

এর অর্থ হ'ল অটো_পিটারটি কম প্রয়োজনীয় হয়ে যায় - কেবলমাত্র শূন্যস্থান পূরণ করার প্রয়োজন যেখানে ধরণের কোনও ভাল swapকার্যকারিতা নেই। তবে সমস্ত স্ট্যান্ড কন্টেইনারই করে।


হতে পারে এটি কম প্রয়োজনীয় হয়ে উঠবে (আমি বলব স্কোপড_পিটার এটি এর চেয়ে কম প্রয়োজনীয় করে তোলে) তবে এটি আর যাচ্ছে না। আপনি যদি মোছার উপর কিছু বরাদ্দ করেন এবং মুছে ফেলার আগে কেউ ছুঁড়ে ফেলে তবে অদলবদল ফাংশনটি আপনাকে কিছুটা সহায়তা করে না or
মিশেল 16

আমি গত অনুচ্ছেদে ঠিক তাই বলেছিলাম।
ড্যানিয়েল আর্উইকার 18

0
  • এক মালিক: কপির উপর আকা মুছে ফেলুন
  • এসটিডি :: auto_ptr

যখন বস্তুর স্রষ্টা স্পষ্টভাবে অন্য কারও কাছে মালিকানা হস্তান্তর করতে চায়। আমি আপনাকে যে কোডটি দিচ্ছি তাতে এটি ডকুমেন্ট করারও একটি উপায় এবং আমি এটি আর ট্র্যাক করছি না তাই নিশ্চিত হয়ে নিন যে আপনি শেষ হয়ে গেলে এটি মুছে ফেলেছেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.