C++ में ऑब्जेक्ट को स्टैक पर (बिना new) या हीप पर (के साथ new) इंस्टेंशिएट किया जा सकता है। दोनों के महत्वपूर्ण अंतर हैं।
तुलना तालिका
| पहलू | बिना new (स्टैक) | साथ new (हीप) |
|---|---|---|
| मेमोरी लोकेशन | स्टैक | हीप |
| लाइफटाइम | स्कोप समाप्त होने पर ऑटोमैटिक नष्ट | मैन्युअली delete तक जीवित |
| साइज सीमा | सीमित (~1-8 MB) | बड़ी (उपलब्ध रैम तक) |
| एक्सेस स्पीड | तेज | थोड़ा धीमा |
| पॉइंटर आवश्यक | नहीं | हां |
| कंस्ट्रक्टर कॉल | ऑटोमैटिक | new द्वारा |
| डिस्ट्रक्टर कॉल | ऑटोमैटिक (स्कोप एंड) | delete द्वारा |
उदाहरण कोड
#include <iostream>
using namespace std;
class Point {
int x, y, z;
public:
Point(int x, int y, int z) : x(x), y(y), z(z) {
cout << "Constructor: (" << x << "," << y << "," << z << ")\n";
}
~Point() {
cout << "Destructor: (" << x << "," << y << "," << z << ")\n";
}
void display() const {
cout << "(" << x << ", " << y << ", " << z << ")\n";
}
};
void stackExample() {
cout << "=== Stack Object ===\n";
Point p1(10, 20, 30); // स्टैक पर
p1.display();
cout << "End of function - destructor called automatically\n";
}
void heapExample() {
cout << "\n=== Heap Object ===\n";
Point *ptr = new Point(100, 200, 300); // हीप पर
ptr->display();
delete ptr; // मैन्युअल डिलीट आवश्यक
cout << "After delete\n";
}
int main() {
stackExample();
heapExample();
// स्मार्ट पॉइंटर (आधुनिक C++)
cout << "\n=== Smart Pointer (C++11) ===\n";
#include <memory>
unique_ptr<Point> smartPtr = make_unique<Point>(1000, 2000, 3000);
smartPtr->display();
// ऑटोमैटिक डिलीट जब smartPtr स्कोप से बाहर जाता है
return 0;
}
आउटपुट
=== Stack Object === Constructor: (10,20,30) (10, 20, 30) End of function - destructor called automatically Destructor: (10,20,30) === Heap Object === Constructor: (100,200,300) (100, 200, 300) After delete Destructor: (100,200,300) === Smart Pointer (C++11) === Constructor: (1000,2000,3000) (1000, 2000, 3000) Destructor: (1000,2000,3000)
मुख्य अंतर:
- स्टैक: लोकल वेरिएबल्स, फंक्शन पैरामीटर्स, RAII के लिए आदर्श। तेज आवंटन/डिएलोकेशन।
- हीप: डायनामिक साइज, शेयर्ड ओनरशिप, लंबे जीवनकाल के लिए।
new/deleteजोड़े में उपयोग करें। - आधुनिक C++: रॉ
new/deleteसे बचें।std::unique_ptr,std::shared_ptr,std::make_uniqueउपयोग करें।
सामान्य गलतियां:
- हीप ऑब्जेक्ट को डिलीट न करना → मेमोरी लीक
- डिलीट के बाद पॉइंटर उपयोग करना → डैंगलिंग पॉइंटर
- दो बार डिलीट करना → अनडिफाइंड बिहेवियर
- स्टैक पर बड़े ऑब्जेक्ट → स्टैक ओवरफ्लो