c++ - উনল - সি++ বই




কেন সি++ প্রোগ্রামারদের 'নতুন' ব্যবহার কমানো উচিত? (12)

Std :: string <std :: string> ব্যবহার করে স্ট্যাক ওভারফ্লো প্রশ্ন মেমরির সাথে স্টিক :: স্ট্রিংয়ের স্ট্রাকলেড , এবং মন্তব্যগুলির মধ্যে একটি হল এই বলে:

new তাই ব্যবহার বন্ধ করুন। আমি যেকোনো জায়গায় আপনি যে কোনও জায়গায় নতুন ব্যবহার করিনি। আপনি C ++ মান দ্বারা বস্তু তৈরি করতে পারেন এবং এটি ভাষা ব্যবহার করার জন্য বিশাল সুবিধাগুলির মধ্যে একটি। আপনি হিপ সবকিছু বরাদ্দ করতে হবে না। একটি জাভা প্রোগ্রামার মত চিন্তা বন্ধ করুন।

আমি সে দ্বারা মানে কি সত্যিই নিশ্চিত নই। বস্তুকে C ++ এর মান অনুসারে যতটা সম্ভব সম্ভব তৈরি করা উচিত, এবং অভ্যন্তরীণভাবে এটি কোন পার্থক্য করে? আমি কি উত্তর ভুল বুঝিয়ে দিলাম?


প্রি-সি ++ 17:

কারণ আপনি যদি স্মার্ট পয়েন্টার ফলাফলটি মোড়ানো করেন তবেও এটি সূক্ষ্ম লিকগুলির প্রবণতা।

স্মার্ট পয়েন্টারগুলিতে বস্তু মোড়ানো মনে রাখার জন্য "সতর্কতা অবলম্বনকারী" ব্যবহারকারীকে বিবেচনা করুন:

foo(shared_ptr<T1>(new T1()), shared_ptr<T2>(new T2()));

এই কোডটি বিপজ্জনক কারণ কোনও গ্যারান্টি নেই যে either shared_ptr হয় T1 বা T2 আগে । অতএব, যদি অন্য কোনও new T1() বা new T2() অন্য shared_ptr পরে ব্যর্থ হয় তবে প্রথম বস্তুটি লিক করা হবে কারণ এটি shared_ptr নেওয়ার এবং shared_ptr করার জন্য কোনও shared_ptr বিদ্যমান নেই।

সমাধান: make_shared ব্যবহার make_shared

পোস্ট-সি ++ 17:

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

ব্যারি আরেকটি উত্তর দিয়ে সি ++ 17 দ্বারা উপস্থাপিত নতুন মূল্যায়ন আদেশের আরো বিশদ ব্যাখ্যা প্রদান করে।


কারণ স্ট্যাক দ্রুত এবং নির্বোধ

C ++ এ, স্থানান্তরের জন্য একক নির্দেশনা লাগে - স্ট্যাকে - প্রদত্ত ফাংশনে প্রতিটি স্থানীয় সুযোগ বস্তুর জন্য, এবং এটি যে মেমরিটি লিক করতে অসম্ভব। যে মন্তব্য উদ্দেশ্য (বা অভিপ্রেত করা উচিত) "স্ট্যাক ব্যবহার করুন এবং গাদা নয়" মত কিছু বলতে


আমি নতুন "খুব বেশী" ব্যবহার করার ধারণা নিয়ে অসম্মতি ঝোঁক। যদিও সিস্টেমের ক্লাসগুলির সাথে নতুন পোস্টারের নতুন ব্যবহারটি একটু হাস্যকর। ( int *i; i = new int[9999]; সত্যিই? int i[9999]; অনেক স্পষ্ট।) আমি মনে করি মন্তব্যকারীর ছাগলটি পেয়ে যাচ্ছিল।

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

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


আমি মনে করি পোস্টার বলতে বোঝানো হয়েছে যে You do not have to allocate everything on the stack পরিবর্তে You do not have to allocate everything on the

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


এটা জটিল.

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

std::string *someString = new std::string(...);
//Do stuff
delete someString;

এই সহজ। কিন্তু কী হবে যদি "স্টাফ করবেন" একটি ব্যতিক্রম ছুঁড়ে ফেলে? ওপস: মেমরি লিক। যদি "স্টাফ করবেন" সমস্যাগুলি কি তাড়াতাড়ি return ? ওপস: মেমরি লিক।

এবং এই সহজ ক্ষেত্রে জন্য । আপনি যে স্ট্রিং ফিরে কেউ যদি ঘটতে, এখন তারা এটি মুছে ফেলতে হবে। এবং যদি তারা এটি একটি যুক্তি হিসাবে পাস, এটা গ্রহণকারী ব্যক্তি এটি মুছে ফেলতে হবে? কখন এটি মুছে ফেলবে?

অথবা, আপনি এটি করতে পারেন:

std::string someString(...);
//Do stuff

কোন delete । বস্তুটিকে "স্ট্যাক" এ তৈরি করা হয়েছিল এবং এটি সুযোগ ছাড়িয়ে গেলে এটি ধ্বংস হয়ে যাবে। আপনি এমনকি বস্তুটি ফেরত পাঠাতে পারেন, এইভাবে কলিং ফাংশনে তার বিষয়বস্তু স্থানান্তর করতে পারেন। আপনি অবজেক্টটি ফাংশনগুলিতে প্রেরণ করতে পারেন (সাধারণত একটি রেফারেন্স বা void SomeFunc(std::string &iCanModifyThis, const std::string &iCantModifyThis) -রেফারেন্স হিসাবে: void SomeFunc(std::string &iCanModifyThis, const std::string &iCantModifyThis) । এবং তাই ঘোষণা করুন।

new ছাড়া সব delete । মেমরি মালিক কে বা এটি মুছে ফেলার জন্য দায়ী কে কোন প্রশ্ন নেই। যদি তুমি করো:

std::string someString(...);
std::string otherString;
otherString = someString;

এটি অন্য otherString একটি অনুলিপি আছে বলে বোঝা যায়। এটি একটি পয়েন্টার নয়; এটি একটি পৃথক বস্তু। তারা একই বিষয়বস্তু থাকতে পারে, তবে আপনি অন্যকে প্রভাবিত না করেই একটি পরিবর্তন করতে পারেন:

someString += "More text.";
if(otherString == someString) { /*Will never get here */ }

ধারণা দেখুন?


দুটি ব্যাপকভাবে ব্যবহৃত মেমরি বরাদ্দ কৌশল আছে: স্বয়ংক্রিয় বরাদ্দ এবং গতিশীল বরাদ্দ। সাধারণভাবে, প্রতিটি জন্য স্মৃতির অনুরূপ অঞ্চল রয়েছে: স্ট্যাক এবং হিপ।

গাদা

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

সি ++ এ, এটি স্বয়ংক্রিয় সঞ্চয়স্থান বলে কারণ সঞ্চয় শেষে স্বয়ংক্রিয়ভাবে দাবি করা হয়। যত তাড়াতাড়ি বর্তমান কোড ব্লক ( {} ) ব্যবহার করে সীমিত করা হয়, সেই ব্লকের সমস্ত ভেরিয়েবলের মেমরি স্বয়ংক্রিয়ভাবে সংগ্রহ করা হয়। এই মুহূর্তে ধ্বংসকারীরা সম্পদ পরিষ্কার করার জন্য আহ্বান জানানো হয়।

গাদা

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

গতিশীল বরাদ্দ ব্যবহার করার কারণ

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

গতিশীল বরাদ্দ ব্যবহার করার দুটি মূল কারণ:

  • আপনি কম্পাইল সময় আপনার প্রয়োজন মেমরি জানি না। উদাহরণস্বরূপ, কোনও স্ট্রিংয়ে কোনও পাঠ্য ফাইল পড়ার সময়, আপনি সাধারণত ফাইলটির আকার কতটুকু জানেন তা নয়, তাই আপনি প্রোগ্রামটি চালিত না হওয়া পর্যন্ত বরাদ্দ করতে কত পরিমাণ মেমরি নির্ধারণ করবেন তা আপনি নির্ধারণ করতে পারবেন না।

  • আপনি বর্তমান ব্লক ছেড়ে পরে যাব যা মেমরি বরাদ্দ করতে চান। উদাহরণস্বরূপ, আপনি একটি ফাংশন string readfile(string path) লিখতে চাইতে পারেন যা একটি ফাইলের বিষয়বস্তু প্রদান করে। এই ক্ষেত্রে, এমনকি যদি স্ট্যাক সমগ্র ফাইল সামগ্রী ধারণ করতে পারে, আপনি একটি ফাংশন থেকে ফিরে আসতে এবং বরাদ্দ মেমরি ব্লক রাখতে পারে না।

গতিশীল বরাদ্দ প্রায়ই অপ্রয়োজনীয় কেন

সি ++ তে একটি নিরস্ত্র গঠন রয়েছে যা ধ্বংসকারী নামে পরিচিত। এই প্রক্রিয়াটি আপনাকে ভেরিয়েবলের জীবদ্দশায় সংস্থার জীবদ্দশায় সারিবদ্ধ করে সম্পদ পরিচালনা করতে দেয়। এই কৌশলটি RAII বলা হয় এবং সি ++ এর পার্থক্যসূচক বিন্দু। এটা বস্তু মধ্যে সম্পদ "wraps"। std::string একটি নিখুঁত উদাহরণ। এই স্নিপেট:

int main ( int argc, char* argv[] )
{
    std::string program(argv[0]);
}

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

বিশেষ করে, এটি ইঙ্গিত করে যে এই স্নিপেটে:

int main ( int argc, char* argv[] )
{
    std::string * program = new std::string(argv[0]);  // Bad!
    delete program;
}

unneeded গতিশীল মেমরি বরাদ্দ আছে। প্রোগ্রামটি আরও টাইপিংয়ের দরকার! () এবং মেমরি হ্রাস করার ভুলে যাওয়ার ঝুঁকি প্রবর্তন করে। এটা কোন আপাত সুবিধা সঙ্গে এই কাজ করে।

আপনি যত তাড়াতাড়ি সম্ভব স্বয়ংক্রিয় স্টোরেজ ব্যবহার করা উচিত

মূলত, শেষ অনুচ্ছেদ এটি আপ sums। যত তাড়াতাড়ি সম্ভব স্বয়ংক্রিয় সঞ্চয়স্থান ব্যবহার করে আপনার প্রোগ্রামগুলি তৈরি করে:

  • টাইপ দ্রুত;
  • দ্রুত চালানোর সময়;
  • মেমরি / সম্পদ লিক কম প্রবণ।

বোনাস পয়েন্ট

রেফারেন্সযুক্ত প্রশ্নে, অতিরিক্ত উদ্বেগ আছে। বিশেষ করে, নিম্নলিখিত ক্লাস:

class Line {
public:
    Line();
    ~Line();
    std::string* mString;
};

Line::Line() {
    mString = new std::string("foo_bar");
}

Line::~Line() {
    delete mString;
}

নিম্নলিখিতটি ব্যবহার করার চেয়ে আসলে অনেক বেশি ঝুঁকিপূর্ণ:

class Line {
public:
    Line();
    std::string mString;
};

Line::Line() {
    mString = "foo_bar";
    // note: there is a cleaner way to write this.
}

কারণ হল std::string সঠিকভাবে একটি কপি কন্সট্রাকটর সংজ্ঞায়িত করে। নিম্নলিখিত প্রোগ্রাম বিবেচনা করুন:

int main ()
{
    Line l1;
    Line l2 = l1;
}

মূল সংস্করণ ব্যবহার করে, এই প্রোগ্রামটি সম্ভবত ক্র্যাশ হবে, কারণ এটি একই স্ট্রিংতে দুবার delete ব্যবহার করে। সংশোধিত সংস্করণ ব্যবহার করে, প্রতিটি Line ইনস্ট্যান্সের নিজস্ব স্ট্রিং ইনস্ট্যান্স থাকবে , প্রত্যেকে নিজের মেমরির সাথে এবং উভয় প্রোগ্রামের শেষে মুক্তি পাবে।

অন্যান্য নোট

উপরের সকল কারণের কারণে RAII ব্যাপক ব্যবহার C ++ তে একটি সর্বোত্তম অনুশীলন বলে মনে করা হয়। তবে, একটি অতিরিক্ত সুবিধা যা অবিলম্বে সুস্পষ্ট নয়। মূলত, এটি তার অংশ যোগফল চেয়ে ভাল। পুরো প্রক্রিয়া composes । এটা স্কেল।

যদি আপনি একটি বিল্ডিং ব্লক হিসাবে Line ক্লাস ব্যবহার করেন:

 class Table
 {
      Line borders[4];
 };

তারপর

 int main ()
 {
     Table table;
 }

চার std::string উদাহরণ বরাদ্দ, চার Line উদাহরণ, একটি Table উদাহরণ এবং সমস্ত স্ট্রিং এর বিষয়বস্তু এবং সবকিছু স্বয়ংক্রিয়ভাবে মুক্ত করা হয়


হিপ overusing এড়াতে একটি উল্লেখযোগ্য কারণ কর্মক্ষমতা জন্য - বিশেষ করে সি ++ দ্বারা ব্যবহৃত ডিফল্ট মেমরি ব্যবস্থাপনা পদ্ধতির কর্মক্ষমতা জড়িত। যদিও বরাদ্দ ছোটো ক্ষেত্রে খুব দ্রুত হতে পারে, অনেক new এবং কঠোর আদেশ ছাড়াই নন-ইউনিফর্ম আকারের বস্তুগুলি delete হয় কেবল মেমরি বিভাজক নয়, তবে এটি বরাদ্দ অ্যালগরিদমকেও জটিল করে তোলে এবং নির্দিষ্ট কিছু ক্ষেত্রে কার্য সম্পাদন সম্পূর্ণভাবে ধ্বংস করতে পারে ।

যে সমস্যাটি সমাধান করার জন্য তৈরি করা মেমরি পুলগুলি , যা ঐতিহ্যগত হিপ প্রয়োগগুলির অন্তর্নিহিত ক্ষতিগুলি হ্রাস করার অনুমতি দেয়, যদিও এখনও আপনি প্রয়োজনীয় হিপটি ব্যবহার করার অনুমতি দিচ্ছেন।

ভাল, যদিও, সমস্যা সম্পূর্ণরূপে এড়ানোর জন্য। আপনি যদি স্ট্যাকের উপর এটি স্থাপন করতে পারেন, তাহলে তা করুন।


new() সম্ভব হিসাবে সামান্য ব্যবহার করা উচিত নয়। এটা সম্ভব হিসাবে সাবধানে ব্যবহার করা উচিত । এবং ব্যবহারিক প্রয়োগ দ্বারা নির্ধারিত হিসাবে প্রায়ই হিসাবে ব্যবহার করা উচিত।

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

যাইহোক, যদি আপনার বস্তুর জীবনকাল বর্তমান সুযোগের বাইরে প্রসারিত করতে হয় তবে new() সঠিক উত্তর। কেবল নিশ্চিত করুন যে আপনি কখন এবং কিভাবে delete() এবং নূল পয়েন্টারের সম্ভাবনাগুলি মুছে ফেলা বস্তুগুলি এবং পয়েন্টার ব্যবহারের সাথে আসা অন্যান্য গোচচগুলির সাহায্যে মনোযোগ দেন।


newনতুন goto

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

newঅনুরূপ - এটি প্রায়ই অপ্রয়োজনীয়ভাবে জটিল এবং পড়তে কঠিন করে তুলতে ব্যবহৃত হয় এবং সবচেয়ে দরকারী ব্যবহার নিদর্শন এনকোড করা যেতে পারে বিভিন্ন ক্লাসে এনকোড করা হয়েছে। তদুপরি, যদি আপনি কোনও নতুন ব্যবহার প্যাটার্ন ব্যবহার করতে চান যার জন্য ইতিমধ্যে ক্লাসিক ক্লাস নেই, তবে আপনি তাদের নিজস্ব ক্লাসগুলি এনকোড করতে পারেন!

আমি এমনকি তর্ক করবে newহয় খারাপ চেয়ে goto, যুক্ত করার প্রয়োজন কারণে newএবং deleteবিবৃতি।

ভালো লেগেছে goto, যদি আপনি মনে করেন যে আপনি ব্যবহার newকরতে চান তবে সম্ভবত আপনি খারাপভাবে কাজ করছেন - বিশেষ করে যদি আপনি এমন একটি শ্রেণী বাস্তবায়নে বাইরে যাচ্ছেন যার জীবনের উদ্দেশ্যটি আপনাকে যে গতিশীল বরাদ্দগুলি করতে হবে তা অন্তর্ভুক্ত করতে হয়।



মূল কারণ হিপ উপর বস্তু সবসময় ব্যবহার করা সহজ এবং সহজ মান থেকে পরিচালনা করা হয়। কোডটি লেখা এবং বজায় রাখা সহজ যা সবসময় গুরুতর প্রোগ্রামারের প্রথম অগ্রাধিকার।

আরেকটি দৃশ্যকল্প হল আমরা যে লাইব্রেরি ব্যবহার করছি তা মূল্যের শব্দটি সরবরাহ করে এবং গতিশীল বরাদ্দ অপ্রয়োজনীয় করে তোলে। Std::stringএকটি ভাল উদাহরণ।

অবজেক্ট ভিত্তিক কোডের জন্য, একটি পয়েন্টার ব্যবহার করে - যা এর অর্থ newপূর্বে তৈরি করতে ব্যবহার করে - একটি আবশ্যক। সম্পদ ব্যবস্থাপনা জটিলতার সহজতর করার জন্য, আমাদের কাছে স্মার্ট পয়েন্টার হিসাবে যতটা সম্ভব সহজ করার জন্য কয়েক ডজন সরঞ্জাম রয়েছে। অবজেক্ট ভিত্তিক প্যারাডিজম বা জেনেরিক প্যারাডিজম মান শব্দার্থী অনুমান করে এবং কম বা না প্রয়োজন new, পোস্টার অন্যত্র বলে ঠিক যেমন।

প্রথাগত নকশার নকশার, বিশেষত যারা GoF বইতে উল্লিখিত new, তারা অনেকগুলি ব্যবহার করে , কারণ এটি সাধারণ OO কোড।


  • সি ++ নিজস্ব দ্বারা কোন মেমরি ম্যানেজার নিয়োগ করে না। অন্যান্য # যেমন সি #, জাভা মেমরি হ্যান্ডেল করতে আবর্জনা সংগ্রাহক আছে
  • সি ++ অপারেটিং সিস্টেম রুটিন ব্যবহার করে মেমরি বরাদ্দ করা এবং খুব বেশি নতুন / মুছে ফেলা উপলব্ধ মেমরি খণ্ডন করতে পারে
  • কোনও অ্যাপ্লিকেশনের সাথে, যদি মেমরিটি প্রায়শই ব্যবহার করা হয় তবে এটি পূর্ব-বরাদ্দ করার পরামর্শ দেওয়া হয় এবং যখন প্রয়োজন হয় না তখন ছেড়ে দেওয়া হয়।
  • ভুল মেমরি পরিচালনা মেমরি লিক হতে পারে এবং এটি ট্র্যাক সত্যিই কঠিন। সুতরাং ফাংশন সুযোগ মধ্যে স্ট্যাক বস্তু ব্যবহার করে একটি প্রমাণিত কৌশল
  • স্ট্যাক অবজেক্টগুলি ব্যবহার করার নেতিবাচক দিক হল, এটি ফিরতি, অবজেক্টে যাওয়ার জন্য বস্তুর একাধিক কপি তৈরি করে। তবে স্মার্ট কম্পাইলারগুলি এই পরিস্থিতিতে ভালভাবে সচেতন এবং তারা কার্য সম্পাদনের জন্য ভালভাবে অপ্টিমাইজ করা হয়েছে।
  • মেমরি বরাদ্দ এবং দুটি ভিন্ন স্থানে মুক্তি যদি এটি সত্যিই ++ মধ্যে ক্লান্তিকর। মুক্তির দায়িত্ব সবসময় একটি প্রশ্ন এবং বেশিরভাগ ক্ষেত্রেই আমরা কিছু সাধারণ অ্যাক্সেসযোগ্য পয়েন্টার, স্ট্যাক বস্তু (সর্বাধিক সম্ভব) এবং auto_ptr (RAII অবজেক্ট)
  • সবচেয়ে ভাল বিষয় হল, আপনি মেমরির উপর নিয়ন্ত্রণ রেখেছেন এবং সবচেয়ে খারাপ জিনিস হল যে যদি আমরা অ্যাপ্লিকেশনের জন্য অনুপযুক্ত মেমরি পরিচালনার কাজ করি তবে মেমরির উপর আপনার কোন নিয়ন্ত্রণ থাকবে না। মেমরি দুর্নীতির কারণে সৃষ্ট ক্র্যাশগুলি নষ্টতম এবং ট্রেস করার জন্য কঠিন।




c++-faq