new ऑपरेटर
हीप में मेमोरी आवंटन का अनुरोध करता है। यदि पर्याप्त मेमोरी उपलब्ध है, तो पॉइंटर वेरिएबल को आरंभ करके उसका पता लौटाता है।
सिंटैक्स
pointer_variable = new datatype;
आरंभीकरण के साथ
pointer_variable = new datatype(value);
ब्लॉक आवंटन (ऐरे)
pointer_variable = new datatype[size];
उदाहरण
#include <iostream>
using namespace std;
int main() {
int* ptr1 = NULL;
ptr1 = new int; // सिंगल int
float* ptr2 = new float(223.324); // आरंभीकरण के साथ
int* ptr3 = new int[28]; // ऐरे ब्लॉक
*ptr1 = 28;
cout << "Value of ptr1: " << *ptr1 << endl;
cout << "Value of ptr2: " << *ptr2 << endl;
if (!ptr3)
cout << "Allocation failed\n";
else {
for (int i = 10; i < 15; i++)
ptr3[i] = i + 1;
cout << "Block values: ";
for (int i = 10; i < 15; i++)
cout << ptr3[i] << " ";
}
return 0;
}
आउटपुट
Value of ptr1: 28 Value of ptr2: 223.324 Block values: 11 12 13 14 15
delete ऑपरेटर
आवंटित मेमोरी को डीएलोकेट (मुक्त) करता है। प्रोग्रामर का विशेषाधिकार है कि बनाए गए पॉइंटर को delete से मुक्त करे।
सिंटैक्स
delete pointer_variable;
ऐरे ब्लॉक हटाने के लिए
delete[] pointer_variable;
उदाहरण (new और delete साथ में)
#include <iostream>
using namespace std;
int main() {
int* ptr1 = new int;
float* ptr2 = new float(299.121);
int* ptr3 = new int[28];
*ptr1 = 28;
cout << "ptr1: " << *ptr1 << endl;
cout << "ptr2: " << *ptr2 << endl;
for (int i = 10; i < 15; i++)
ptr3[i] = i + 1;
cout << "Block: ";
for (int i = 10; i < 15; i++)
cout << ptr3[i] << " ";
delete ptr1; // सिंगल ऑब्जेक्ट
delete ptr2; // सिंगल ऑब्जेक्ट
delete[] ptr3; // ऐरे ब्लॉक
return 0;
}
आउटपुट
ptr1: 28 ptr2: 299.121 Block: 11 12 13 14 15
महत्वपूर्ण नियम
- हर
newका मिलानdeleteसे होना चाहिए - हर
new[]का मिलानdelete[]से होना चाहिए - गलत मिलान अपरिभाषित व्यवहार का कारण बनता है
- NULL पॉइंटर पर delete सुरक्षित है (कुछ नहीं करता)
- आधुनिक C++ में स्मार्ट पॉइंटर्स (
unique_ptr,shared_ptr) पसंद किए जाते हैं
स्मार्ट पॉइंटर उदाहरण (C++11)
#include <memory>
#include <iostream>
int main() {
auto ptr1 = std::make_unique<int>(28);
auto ptr2 = std::make_unique<float>(223.324f);
auto arr = std::make_unique<int[]>(28);
// स्वचालित डीएलोकेशन, कोई delete आवश्यक नहीं
return 0;
}