একটি সাধারণ পরীক্ষা অ্যাপ্লিকেশন:
cout << new int[0] << endl;
আউটপুট:
0x876c0b8
সুতরাং দেখে মনে হচ্ছে এটি কাজ করে। স্ট্যান্ডার্ড এ সম্পর্কে কী বলে? মেমরির খালি ব্লকটি "বরাদ্দ" করা কি সর্বদা আইনী?
একটি সাধারণ পরীক্ষা অ্যাপ্লিকেশন:
cout << new int[0] << endl;
আউটপুট:
0x876c0b8
সুতরাং দেখে মনে হচ্ছে এটি কাজ করে। স্ট্যান্ডার্ড এ সম্পর্কে কী বলে? মেমরির খালি ব্লকটি "বরাদ্দ" করা কি সর্বদা আইনী?
উত্তর:
5.3.4 / 7 থেকে
যখন সরাসরি-নতুন-ঘোষকটিতে অভিব্যক্তির মান শূন্য হয়, বরাদ্দ ফাংশনটি কোনও উপাদান ছাড়াই একটি অ্যারে বরাদ্দ করতে বলা হয়।
৩. 3..৩.১/২০১। থেকে
শূন্য আকারের জন্য একটি অনুরোধ হিসাবে ফিরে আসা পয়েন্টারের ডিফারেন্সিংয়ের প্রভাব অপরিজ্ঞাত।
এছাড়াও
অনুরোধ করা জায়গার আকার [নতুন দ্বারা] শূন্য হলেও, অনুরোধটি ব্যর্থ হতে পারে।
তার মানে আপনি এটি করতে পারেন, তবে আপনি আইনীভাবে (সমস্ত প্ল্যাটফর্ম জুড়ে একটি সুস্পষ্ট সংজ্ঞায়িত পদ্ধতিতে) আপনার যে স্মৃতি পেয়েছেন তা হ্রাস করতে পারবেন না - আপনি কেবল এটি অ্যারে মুছতে পাস করতে পারেন - এবং আপনার এটি মুছে ফেলা উচিত।
এখানে একটি আকর্ষণীয় পাদটীকা রয়েছে (উদাহরণস্বরূপ মানের কোনও আদর্শিক অংশ নয়, তবে এক্সপোজারিটরি উদ্দেশ্যে অন্তর্ভুক্ত) বাক্যটির সাথে সংযুক্ত 3.7.3.1/2
[32। অভিপ্রায়টি হ'ল malloc () বা কলোক () কল করে অপারেটর নতুন () প্রয়োগযোগ্য হবে, সুতরাং নিয়মগুলি যথেষ্ট পরিমাণে একই stan নন-নাল পয়েন্টারটি ফেরত দেওয়ার জন্য শূন্যের অনুরোধের ক্ষেত্রে সি ++ সি থেকে আলাদা হয় fers]
new[]
সাথে ভারসাম্য রাখবেন না delete[]
- আপনি মেমরি ফাঁস আশা করতে পারেন the বিশেষত, যখন আপনি কল করবেন তখন new[i]
অ্যারের আকার সংরক্ষণ করার জন্য যা delete[]
বরাদ্দ করার চেষ্টা করছেন তার চেয়ে কিছুটা বেশি মেমোরি প্রয়োজন (যা পরে পরে নির্ধারণের পরে ব্যবহৃত হয় )
হ্যাঁ, এটির মতো শূন্য আকারের অ্যারে বরাদ্দ করা বৈধ। তবে আপনাকে অবশ্যই এটি মুছে ফেলতে হবে।
int ar[0];
বেআইনী কেন নতুন ঠিক আছে?
sizeof (type)
কখনই শূন্যের প্রত্যাবর্তন হবে না। : যেমন দেখুন stackoverflow.com/questions/2632021/can-sizeof-return-0-zero
স্ট্যান্ডার্ড এ সম্পর্কে কী বলে? মেমরির খালি ব্লকটি "বরাদ্দ" করা কি সর্বদা আইনী?
প্রতিটি বস্তুর একটি স্বতন্ত্র পরিচয়, অর্থাত্ একটি অনন্য ঠিকানা, যা একটি শূন্য-দৈর্ঘ্য বোঝায় (মেমরির আসল পরিমাণটি নিঃশব্দে বৃদ্ধি পাবে, যদি আপনি শূন্য বাইট চেয়ে থাকেন)।
আপনি যদি এইগুলির একটিরও বেশি বরাদ্দ করেন তবে আপনি দেখতে পাবেন যে তাদের আলাদা ঠিকানা রয়েছে।
operator []
এছাড়াও অ্যারের আকারটি কোথাও সঞ্চয় করে ( isocpp.org/wiki/faq/freestore-mgmt#num-elems-in-new-array দেখুন )। সুতরাং যদি প্রয়োগটি ডেটা সহ বাইট গণনা বরাদ্দ করে তবে এটি কেবল বাইট গণনা এবং ডেটার জন্য 0 বাইটের জন্য বরাদ্দ করতে পারে, 1-গত-শেষ পয়েন্টারটি ফিরিয়ে দেয়।
operator new[]
বিভিন্ন পয়েন্টার ফিরে আসা উচিত। new expression
বিটিডাব্লু , এর কিছু অতিরিক্ত নিয়ম রয়েছে (৫.৩.৪) new
0 আকারের সাথে আসলে কিছু বরাদ্দ করা দরকার এমন কোনও ক্লু আমি খুঁজে পাইনি। দুঃখিত, আমি হ্রাস পেয়েছি কারণ আমি দেখতে পেয়েছি যে আপনার উত্তর প্রশ্নের উত্তর দিচ্ছে না, তবে কিছু বিতর্কিত বক্তব্য সরবরাহ করছে।
new[]
বাস্তবায়নের পক্ষে এমন কোনও পরিসরে ঠিকানাগুলি
while(!exitRequested) { char *p = new char[0]; delete [] p; }
ছাড়াই একটি লুপ চালাচ্ছে এটি সম্ভবত ঠিকানা স্থানের বাইরে চলে যাওয়ার আগে ধূলিতে পড়ে যাবে, তবে ৩২-বিট পয়েন্টারযুক্ত প্ল্যাটফর্মে যেটি হবে অনেক কম যুক্তিসঙ্গত অনুমান।
হ্যাঁ এটি 0
দিয়ে একটি আকারের ব্লক বরাদ্দ করা সম্পূর্ণ আইনী new
। আপনার অ্যাক্সেসের জন্য কোনও বৈধ ডেটা নেই বলে আপনি কেবল এটির সাথে দরকারী কিছু করতে পারবেন না। int[0] = 5;
অবৈধ।
তবে, আমি বিশ্বাস করি যে স্ট্যান্ডার্ডটি জিনিসগুলিতে malloc(0)
ফিরে আসতে পছন্দ করে NULL
।
delete []
বরাদ্দ থেকে আপনি যে কোনও পয়েন্টার ফিরে পেতে পারেন তার জন্য আপনার এখনও প্রয়োজন হবে ।
কৌতূহলজনকভাবে, সি ++ এর জন্য অপারেটরের নতুনকে বৈধ পয়েন্টার প্রদানের প্রয়োজন হয় এমনকি শূন্য বাইটের জন্য অনুরোধ করা হলেও। (এই অদ্ভুত-স্বাদযুক্ত আচরণের প্রয়োজনের ফলে ভাষার অন্য কোথাও জিনিস সহজতর হয়))
আমি কার্যকর সি ++ তৃতীয় সংস্করণটি "আইটেম 51: নতুন লেখার সময় কনভেনশন মেনে চলুন এবং মুছুন" তে এটি বলেছি found
আমি আপনাকে গ্যারান্টি দিচ্ছি যে নতুন ইনট [0] আপনার অতিরিক্ত জায়গার জন্য ব্যয় করেছে যেহেতু আমি এটি পরীক্ষা করেছি।
উদাহরণস্বরূপ, এর মেমরি ব্যবহার
int **arr = new int*[1000000000];
তুলনায় উল্লেখযোগ্যভাবে ছোট
int **arr = new int*[1000000000];
for(int i =0; i < 1000000000; i++) {
arr[i]=new int[0];
}
প্রথম কোড স্নিপেটের দ্বিতীয় কোড স্নিপেট বিয়োগের মেমরির ব্যবহার হ'ল অসংখ্য নতুন ইনট [0] এর জন্য ব্যবহৃত মেমরি।