2010-10-27 8 views
5

मैंने एक vc7.1 प्रोजेक्ट को बनाम 2010 में परिवर्तित करने की कोशिश की जिसे मुझे कोडप्रोजेक्ट से मिला। (और यहां लिंक एचटीटी पी: //www.codeproject.com/KB/cpp/transactions.aspx है? Fid = 11253 & df = 90 & एमपीपी = 50 & शोर = 3 & प्रकार = स्थिति & दृश्य = विस्तारित & fr = 1 # xx0xxक्या प्लेसमेंट पॉइंटर शून्य होने पर प्लेसमेंट नए कन्स्ट्रक्टर को कॉल करता है?

लेकिन परिवर्तित और इसके विन्यास संशोधित करने के बाद।

मुझे लगता है यह असफल डिबग, यह क्रिया के अपवाद कहते हैं DrawIt.exe में 0x0028e7b9: 0xC0000005: उल्लंघन उल्लंघन स्थान 0x00000000 का उपयोग करें।

त्रुटि पंक्ति इस

data = new(Mm::Allocate(sizeof(DocData), sid)) DocData(); 

और समारोह

void* Allocate(size_t size, SPACEID sid) 
{ 
    AUDIT 

    Spaces::iterator s = spaces.find(sid); 
    if (s == spaces.end()) 
     return NULL; 

    Space& space = s->second; 
    if (!space.transacting) 
     return NULL; 

    size = max(size, sizeof(Free)); 

    // TODO: assert that "data" is allocated in space 
    space.AssertData(); 

    // are there any more free chunks? 
    if (!space.data->sFreeHead) { 
     space.data->Insert(space.More(size)); 
    } 

    AUDIT 

    // find the first chunk at least the size requested 
    Free* prev = 0; 
    Free* f = space.data->sFreeHead; 
    while (f && (f->size < size)) { 
     prev = f; 
     f = f->next; 
    } 

    AUDIT 
    // if we found one, disconnect it 
    if (f) { 
     space.data->locTree.remove((size_t)f); 

     if (prev) prev->next = f->next; 
     else space.data->sFreeHead = f->next; 

     f->next = 0; 
     memset(&f->loc, 0, sizeof(f->loc)); 
    } else { 
     f = space.More(size); 
    } 

    // f is disconnected from the free list at this point 

    AUDIT 

    // if the free chunk is too(?) big, carve a peice off and return 
    // the rest to the free list 
    if (f->size > (2*(size + sizeof(Free)))) { 
     Free* tmp = space.data->Slice(f, size); // slice size byte off 'f' 
     space.data->Insert(f); // return the remainder to the free list 
     f = tmp; 
    } 

    AUDIT 

    CHECK_POINTER(f) 

    void* p = reinterpret_cast<void*>((char*)f + sizeof(Free::SIZE_TYPE)); 

    CHECK_POINTER(p) 

    return p; 
} 

किसी को भी, विचार आया plz की तरह चला जाता है?

चूंकि मैं सी ++ में अच्छा नहीं हूं, इस समस्या को हल करने के बारे में मुझे पता लगाने में कुछ समय लगेगा। बस स्रोत कोड source file अपलोड किया गया है, अगर कोई मदद कर सकता है तो इसकी सराहना की जाएगी।

+0

यह वास्तव में एक अच्छा सवाल है जिसे छोटे शब्दों में बहाल किया जा सकता है: * प्लेसमेंट पॉइंटर शून्य होने पर नया कन्स्ट्रक्टर कॉल करता है? * –

उत्तर

2

अच्छा, आपका Allocate फ़ंक्शन स्पष्ट रूप से NULL लौटा रहा है। हमारे लिए कहां और क्यों कहना बहुत मुश्किल है, और आपके लिए ब्रेकपॉइंट्स सेट करने और आवंटक के माध्यम से कदम उठाने के लिए यह छोटा है, इसलिए मेरा सुझाव है कि आप ऐसा करें और पता लगाएं कि फ़ंक्शन कहां लौटाता है।

+0

यह एक निश्चित सूचक देता है ... शून्य के बाद * p = reinterpret_cast ((char *) f + sizeof (फ्री :: SIZE_TYPE)); – WhiteTopaz

4

[यह उत्तर गलत हो सकता है; चर्चा के लिए टिप्पणियां देखें; मैं इस पल के लिए इस अवांछित को छोड़ दूंगा ताकि हम यह जान सकें कि उत्तर क्या है]

Allocate कई विफल मामलों में NULL देता है।

आप इसका उपयोग करने से पहले Allocate पर कॉल करने का नतीजा नहीं देखते हैं।

आपको परिणाम की जांच करने की आवश्यकता है। वैकल्पिक रूप से, जब आप विफल हो जाते हैं तो आप अपवाद फेंक सकते हैं।

+0

धन्यवाद, मैं देखता हूं कि मैं इसे ठीक कर सकता हूं या नहीं। – WhiteTopaz

+0

लेकिन पी वापस आने पर शून्य नहीं है, यह 0x0042ffd8 देता है? – WhiteTopaz

+0

क्या आपको प्लेसमेंट को कॉल करने से पहले वास्तव में शून्य की जांच करने की आवश्यकता है? मैं इसे मानक से निर्धारित करने में असमर्थ रहा हूं। एक तरफ, ऐसा करने के लिए समझदार लगता है, दूसरी तरफ, कोई फेंकने वाला नया संकेत नहीं है कि आवंटक 0 वापस कर सकता है, और बाद में प्लेसमेंट निर्माण छोड़ दिया जाना चाहिए ... मुझे लगता है कि प्लेसमेंट नया * कर सकता है * एक शून्य सूचक पर बुलाया जाना चाहिए, लेकिन मानक से कोई स्पष्ट संदर्भ नहीं है। इसे 'नया (std :: nothrow)' से पहले * कॉलिंग प्लेसमेंट नया * करने से पहले भी संभाला जा सकता है। बीटीडब्ल्यू, जी ++ 4.2.1: 'नया (0) परीक्षण; 'कन्स्ट्रक्टर को कॉल नहीं करता है, न ही मर जाता है। –

संबंधित मुद्दे