সি ++ কেন আপনাকে কোনও কনস্ট্রাক্টরের ঠিকানা নিতে দেয় না?


14

এর কোন সুনির্দিষ্ট কারণ রয়েছে যে এটি ভাষাটি ধারণাগতভাবে ভেঙে ফেলবে বা কোনও নির্দিষ্ট কারণেই এটি প্রযুক্তিগতভাবে অক্ষম যে একটি নির্দিষ্ট কারণ?

নতুন অপারেটরের সাথে ব্যবহারটি হবে।

সম্পাদনা: আমি আমার "নতুন অপারেটর" এবং "অপারেটর নতুন" সোজা হয়ে সরাসরি থাকার বিষয়ে আশা ছেড়ে যাচ্ছি।

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


এটি কোনও কনস্ট্রাক্টরের ঠিকানা নেওয়ার সমস্যা হবে না, তবে প্রায় প্রকারের মধ্যে পাস করতে সক্ষম হচ্ছে। টেমপ্লেটগুলি এটি করতে পারে।
ইউফোরিক

আপনার যদি কোনও ফাংশন টেম্পলেট থাকে যা আপনি কোনও কনস্ট্রাক্টর ব্যবহার করে কোনও অবজেক্ট তৈরি করতে চান যা ফাংশনের আর্গুমেন্ট হিসাবে নির্দিষ্ট করা হবে?
প্রেক্সোলাইটিক

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

1
@ রবার্টহারভে প্রশ্নটি আমার কাছে যখন আমি কারখানার ক্লাস টাইপ করতে যাচ্ছিলাম তখনই আমার মনে হয়েছিল।
প্রেক্সোলাইটিক

1
আমি অবাক হই যদি সি ++ 11 std::make_uniqueএবং std::make_sharedএই প্রশ্নের জন্য অন্তর্নিহিত ব্যবহারিক প্রেরণার পর্যাপ্ত সমাধান করতে পারে। এগুলি টেমপ্লেট পদ্ধতি, যার অর্থ একজনকে কনস্ট্রাক্টরের কাছে ইনপুট আর্গুমেন্টগুলি ক্যাপচার করতে হবে এবং তারপরে এগুলি প্রকৃত নির্মাণকারীকে ফরোয়ার্ড করতে হবে।
রওয়ং

উত্তর:


10

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

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


2
তবুও, বাধা দিচ্ছেন কেন memcpy(buffer, (&std::string)(int, char), size)? (সম্ভবত অত্যন্ত আন-কোশার, তবে এটি সর্বোপরি সি ++))
টমাস এডিং

3
দুঃখিত, তবে আপনি যা লিখেছেন তা কোনও অর্থবোধ করে না। আমি কোনও কনস্ট্রাক্টরকে পয়েন্টার টু মেম্বার পয়েন্ট করাতে ভুল দেখছি না। এছাড়াও, উত্সের লিঙ্ক ছাড়াই আপনি কিছু উদ্ধৃত করেছেন বলে মনে হচ্ছে।
BЈовић

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

আমি এটি ফ্রি ফাংশন পয়েন্টারের ঠিকানা হিসাবে এটি একই কাজ করবে আশা করব memcpy(buffer, strlen, size)। সম্ভবত এটি সমাবেশটি অনুলিপি করবে, তবে কে জানে। কোডটি ক্র্যাশ না করেই আহ্বান করা যেতে পারে বা না আপনার ব্যবহারকারীর সংকলকটি সম্পর্কে জ্ঞানের প্রয়োজন হবে। একই আকার নির্ধারণের জন্য যায়। এটি অত্যন্ত প্ল্যাটফর্ম নির্ভর, তবে প্রচুর নন-পোর্টেবল সি ++ কনস্ট্রাক্টস উত্পাদন কোডে ব্যবহৃত হয়। আমি এটিকে অবৈধ করার কোনও কারণ দেখছি না।
টমাস এডিং

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

5

কনস্ট্রাক্টর এমন একটি ফাংশন যা আপনি কল করেন যখন বস্তুটি এখনও বিদ্যমান না থাকে, সুতরাং এটি সদস্য ফাংশন হতে পারে না। এটি অচল হতে পারে।

মেমরি বরাদ্দ হওয়ার পরে তবে এটি সম্পূর্ণরূপে শুরু করার আগে একজন কনস্ট্রাক্টর আসলে এই পয়েন্টারটির সাথে কল করে। ফলস্বরূপ একজন নির্মাণকারীর বেশ কয়েকটি সুবিধামত বৈশিষ্ট্য রয়েছে।

যদি আপনার কোনও কনস্ট্রাক্টরের কাছে পয়েন্টার থাকে তবে এটি হয় স্ট্যাটিক পয়েন্টার, কারখানার ফাংশনের মতো কোনও জিনিস বা কোনও বিশেষ পয়েন্টার যা মেমোরি বরাদ্দের সাথে সাথে ডাকা হবে। এটি কোনও সাধারণ সদস্যের কাজ হতে পারে না এবং এখনও কনস্ট্রাক্টর হিসাবে কাজ করে।

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

আপনি যদি কেবল সাধারণ আরম্ভের কোডটি রিফ্যাক্টর করতে চান তবে একটি সাধারণ মেমরি ফাংশন সাধারণত পর্যাপ্ত উত্তর হয় এবং আপনি এর মধ্যে একটিতে একটি পয়েন্টার পেতে পারেন।


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

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

কিছুই নয়, স্পষ্টতই তাদের "বিশেষ সদস্যের কার্যাদি" হিসাবে উপাধি রয়েছে। সি ++ 11 স্ট্যান্ডার্ডের 12 ধারা: "ডিফল্ট কনস্ট্রাক্টর (12.1), কপি কনস্ট্রাক্টর এবং কপি অ্যাসাইনমেন্ট অপারেটর (12.8), মুভ কনস্ট্রাক্টর এবং মুভ অ্যাসাইনমেন্ট অপারেটর (12.8), এবং ডিস্ট্রাক্টর (12.4) বিশেষ সদস্য ফাংশন ।"
প্রক্সিওলিটিক

এবং 12.1: "কোনও নির্মাণকারীর ভার্চুয়াল (10.3) বা স্থির (9.4) হবে না।" (আমার জোর)
প্রক্সিওলিটিক

1
আসল বিষয়টি হ'ল আপনি যদি ডিবাগ প্রতীকগুলি সংকলন করেন এবং স্ট্যাক ট্রেস সন্ধান করেন তবে প্রকৃতপক্ষে নির্মাণকারীর একটি পয়েন্টার রয়েছে। যা আমি কখনই সক্ষম হইনি তা হ'ল এই পয়েন্টারটি পাওয়ার সিনট্যাক্সটি খুঁজে পাওয়া ( &A::Aআমার চেষ্টা করা
কোনও সংকলকটিতে

-3

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

উপসংহার: - সুতরাং উপসংহারটি হ'ল রিটার্ন টাইপ বাদ দেওয়ার কারণে এটি স্মৃতিতে ঠিকানা পাবে না।


1
কনস্ট্রাক্টরের কোডটির একটি ঠিকানা মেমরিতে থাকতে হবে কারণ এটি কোথাও থাকতে হবে। স্ট্যাকের জন্য এটির জন্য স্থান সংরক্ষণ করার দরকার নেই তবে এটি অবশ্যই স্মৃতিতে কোথাও থাকা উচিত। আপনি করতে পারেন ফাংশন যে মান ফেরত না করছে তার ঠিকানার সাথে নিতে। (void)(*fptr)()কোনও ফিরতি মান না দিয়ে একটি ফাংশনে একটি পয়েন্টার ঘোষণা করে।
প্রেক্সোলাইটিক

2
আপনি প্রশ্নের বিন্দুটি মিস করেছেন - মূল পোস্টটি কনস্ট্রাক্টরের জন্য কোডের ঠিকানা নেওয়ার বিষয়ে জিজ্ঞাসা করেছিল, কনস্ট্রাক্টরের দেওয়া ফলাফল নয়। তদতিরিক্ত, এই বোর্ডে, দয়া করে পূর্ণ শব্দটি ব্যবহার করুন: "আপনি" "আপনি" এর জন্য গ্রহণযোগ্য প্রতিস্থাপন নয়।
ববডালগাইশ

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

এবং আমাকে রেফারেন্স ভেরিয়েবল সম্পর্কেও বলুন। আমরা কি রেফারেন্স ভেরিয়েবলের ঠিকানা আনতে পারি? যদি না হয় তবে কী ঠিকানা মুদ্রণ ("% u", & (& (জে))); & j = x যেখানে x = 10 ছাপছে? কারণ
প্রিন্টফ

-4

আমি একটি বন্য অনুমান গ্রহণ করব:

সি ++ কনস্ট্রাক্টর এবং ডেস্ট্রাক্টর মোটেই ফাংশন নয়: এগুলি ম্যাক্রো। বস্তুটি যেখানে তৈরি করা হয় সেখানে এবং বস্তুটি যেখানে বিনষ্ট হয় তার সুযোগগুলিতে তারা inুকে পড়ে। ঘুরে দেখা যায়, কোনও নির্মাণকারী বা ধ্বংসকারী নেই, কেবলমাত্র বস্তুটি।

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

সি ++ "অবজেক্ট" এর ভার্চুয়াল টেবিলটি কোনও জাভাস্ক্রিপ্ট অবজেক্টের মতো নয়, যেখানে আপনি এটির 'কন্সট্রাক্টর পেতে পারেন এবং রানটাইমের মাধ্যমে এটি থেকে অবজেক্ট তৈরি করতে পারবেন new XMLHttpRequest.constructor, বরং বেনামে ফাংশনগুলির জন্য পয়েন্টারগুলির একটি সংগ্রহ যা এই বস্তুর সাথে ইন্টারফেস করার উপায় হিসাবে কাজ করে , অবজেক্ট তৈরির ক্ষমতা বাদ দিয়ে। এবং অবজেক্টটি "মুছে ফেলা" এমনকি এমনকি এটি কোনও কাঠামো মোছার চেষ্টা করার মতোও বোঝায় না, এটি আপনি পারবেন না: এটি কেবল একটি স্ট্যাক লেবেল, অন্য লেবেলের নীচে দয়া করে এটি লিখুন: আপনি স্বাধীন 4 টি পূর্ণসংখ্যা হিসাবে একটি শ্রেণি ব্যবহার করুন:

/* i imagine this string gets compiled into a struct, one of which's members happens to be a const char * which is initialized to exactly your string: no function calls are made during construction. */
std::string a = "hello, world";
int *myInt = (int *)(*((void **)&a));
myInt[0] = 3;
myInt[1] = 9;
myInt[2] = 20;
myInt[3] = 300;

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

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

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

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


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

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

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

স্ট্রিং বাস্তবায়নের উপর নির্ভর করে আপনি যে বাইটগুলি চান না তা লিখতে পারেন। স্ট্রিং যদি এর মতো কিছু হয় struct { int size; const char * data; };(যেমন ধরুন আপনি মনে করছেন) আপনি একটি মেমরি ঠিকানায় 4 * 4 বাইট = 16 বাইট লিখেন যেখানে আপনি কেবল একটি x86 মেশিনে 8 বাইট সংরক্ষণ করেছেন, সুতরাং 8 বাইট অন্য ডেটার উপরে লেখা থাকে (যা আপনার স্ট্যাককে দূষিত করতে পারে) )। ভাগ্যক্রমে, std::stringসাধারণত সংক্ষিপ্ত স্ট্রিংগুলির জন্য কিছু কিছু জায়গায় অন্তর্ভুক্তি থাকে, সুতরাং কিছু বড় স্ট্যান্ড বাস্তবায়ন ব্যবহার করার সময় এটি আপনার উদাহরণের পক্ষে যথেষ্ট বড় হওয়া উচিত।
হাফমেল

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