Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C++

C++ में new के साथ और बिना ऑब्जेक्ट इंस्टेंशिएशन का अंतर


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 उपयोग करें।

सामान्य गलतियां:

  • हीप ऑब्जेक्ट को डिलीट न करना → मेमोरी लीक
  • डिलीट के बाद पॉइंटर उपयोग करना → डैंगलिंग पॉइंटर
  • दो बार डिलीट करना → अनडिफाइंड बिहेवियर
  • स्टैक पर बड़े ऑब्जेक्ट → स्टैक ओवरफ्लो
  1. C++ में new का उपयोग करके 2D ऐरे कैसे घोषित करें C++ में new का उपयोग करके 2D ऐरे कैसे घोषित करें

    एक डायनामिक 2D ऐरे मूल रूप से ऐरे के पॉइंटर्स का ऐरे होता है। यहां 3 x 4 आयाम वाले 2D ऐरे का एक आरेख है। एल्गोरिदम Begin ऐरे के आयाम घोषित करें। new का उपयोग करके 2D ऐरे a[][] को डायनामिक रूप से आवंटित करें। ऐरे को तत्वों से भरें। ऐरे प्रिंट करें। इसे हटाकर मेमोरी साफ़ करें। End

  1. - C/C++ में const int*, const int * const, और int const * में अंतर?

    उपरोक्त प्रतीकों का अर्थ निम्नलिखित है: int* - int का पॉइंटर। यह काफी स्पष्ट है। int const * - const int का पॉइंटर। int * const - int का कॉन्स्ट पॉइंटर। int const * const - const int का कॉन्स्ट पॉइंटर। यह भी ध्यान दें कि: const int * और int const * समान हैं। const int * const और int const * const स

  1. - C++ में डिक्लेरेशन और डेफिनिशन में क्या अंतर है?

    C++ में डिक्लेरेशन और डेफिनिशन अक्सर भ्रमित होते हैं। डिक्लेरेशन का अर्थ है (C में) कि आप कंपाइलर को किसी वेरिएबल, या यूजर-डिफाइंड टाइप या फंक्शन के टाइप, साइज और फंक्शन डिक्लेरेशन के मामले में उसके पैरामीटर्स के टाइप और साइज के बारे में बता रहे हैं। डिक्लेरेशन के मामले में किसी भी वेरिएबल के लिए म