मैं सोच रहा हूं कि नए के साथ ढेर पर बनाई गई वस्तुओं में अंतर्निर्मित प्रकार शून्य से प्रारंभ किए जाएंगे? क्या यह मानक द्वारा अनिवार्य है या यह संकलक विशिष्ट है?

निम्नलिखित कोड को देखते हुए:

#include <iostream>

using namespace std;

struct test
{
    int _tab[1024];
};

int main()
{
    test *p(new test);

    for (int i = 0; i < 1024; i++)
    {
        cout << p->_tab[i] << endl;
    }

    delete p;
    return 0;
}

चलाते समय, यह सभी शून्य प्रिंट करता है।

1
kyku 4 फरवरी 2012, 19:31

3 जवाब

आप चुन सकते हैं कि क्या आप डिफ़ॉल्ट-आरंभीकरण चाहते हैं, जो मौलिक प्रकार (और सामान्य रूप से पीओडी प्रकार) को अप्रारंभीकृत छोड़ देता है, या मूल्य-प्रारंभिकरण, जो शून्य-प्रारंभिक मौलिक (और पीओडी) को छोड़ देता है ) प्रकार।

int * garbage = new int[10];    // No initialisation
int * zero    = new int[10]();  // Initialised to zero.

यह मानक द्वारा परिभाषित किया गया है।

11
Mike Seymour 4 फरवरी 2012, 20:11

यह मानक द्वारा अनिवार्य नहीं है। आदिम प्रकार के सदस्यों के लिए स्मृति में कोई भी मान हो सकता है जो स्मृति में आखिरी बार छोड़ा गया था।

मुझे लगता है कि कुछ कंपाइलर्स बाइट्स को इनिशियलाइज़ करना चुन सकते हैं। कई कोड के डिबग बिल्ड में करते हैं। डिबगिंग करते समय वे आपको एक संकेत देने के लिए कुछ ज्ञात बाइट अनुक्रम प्रदान करते हैं कि स्मृति आपके प्रोग्राम कोड द्वारा प्रारंभ नहीं की गई थी।

0
Scott Langham 4 फरवरी 2012, 19:37

कॉलोक का उपयोग करके बाइट्स को 0 से प्रारंभ किया जाएगा, लेकिन यह मानक-विशिष्ट नहीं है। कॉलोक जैसा कि सी के साथ-साथ मॉलोक के आसपास रहा है। हालांकि, आप कॉलोक का उपयोग करने के लिए रन-टाइम ओवरहेड का भुगतान करेंगे।

Std::string का उपयोग करने के बारे में पहले दी गई सलाह काफी अच्छी है, क्योंकि आखिरकार, आप std का उपयोग कर रहे हैं, और वर्ग निर्माण/विनाश व्यवहार का लाभ प्राप्त कर रहे हैं। दूसरे शब्दों में, आपको जितनी कम चिंता करनी होगी, जैसे डेटा को इनिशियलाइज़ करना, उतना ही कम गलत हो सकता है।

-1
octopusgrabbus 4 फरवरी 2012, 19:45