2011-10-06 22 views
5

क्या कोई मुझे बता सकता है कि मुझे इस कोड उदाहरण के साथ "उल्लंघन उल्लंघन स्थान का उपयोग क्यों मिलता है"? और मैं इसे कैसे ठीक कर सकता हूं?मुझे इस कोड के साथ "उल्लंघन उल्लंघन स्थान का उपयोग" त्रुटि क्यों मिलती है?

#include <vector> 
using namespace std; 
struct StructTest; 
struct Struct1; 
typedef struct Struct1{ 
    StructTest* test; 
} Struct1; 

typedef struct StructTest{ 
    vector<Struct1*> test123; 
} StructTest; 

static StructTest* abc; 

int test(){ 
    abc = (StructTest*) malloc(sizeof(StructTest));; 
    Struct1* a1 = (Struct1*) malloc(sizeof(Struct1)); 
    a1->test = abc; 
    abc->test123.push_back(a1); 
    return 0; 
} 

int main(){ 
    test(); 
    return 0; 
} 
+0

कौन सी लाइन त्रुटि का कारण बनती है? –

+0

+1 एक अच्छी तरह से पूछे जाने वाले प्रश्न ([एसएससीसी] (http://sscce.org) के लिए +1) – Flexo

उत्तर

4

यह इस लाइन पर दुर्घटनाग्रस्त है:

abc->test123.push_back(a1); 

कारण यह है कि आप इसे malloc का उपयोग करके उपरोक्त दो पंक्तियों का आवंटन। इसलिए, test123 की सामग्री अनियमित है। इसलिए जब आप push_back पर कॉल करते हैं तो यह क्रैश हो जाता है।

+0

आपके त्वरित उत्तर के लिए धन्यवाद, तो मैं इसे कैसे ठीक कर सकता हूं? – tandaica0612

+0

'malloc (sizeof (StructTest)) के बजाय 'नया स्ट्रक्चरटेस्ट' का उपयोग करें। इसके बजाय अन्य 'malloc' उपयोग 'new' पर लागू होता है। – Mysticial

6

आपने test123 नहीं बनाया था। malloc के बजाय new के साथ structs आवंटित करें और यह आपके लिए test123 बनाएगा।

abc = new StructTest; 
Struct1* a1 = new Struct1; 

delete बजाय free साथ निपटाने के लिए याद रखें।

वास्तव में, चूंकि आप सी ++ का उपयोग कर रहे हैं, तो आपको बस malloc का उपयोग करना बंद कर देना चाहिए।

1

मॉलोक का उपयोग न करें, नया उपयोग करें। malloc इस मामले में कन्स्ट्रक्टरों को बुलाया नहीं जाता है इसलिए आपका वेक्टर वैध वस्तु नहीं है।

0

क्योंकि, जब आप "मॉलोक" के साथ एक ब्लॉक आवंटित करते हैं तो इसमें कचरा, शून्य, या जो कुछ भी हो सकता है।

ऑब्जेक्ट test123 एक सी ++ ऑब्जेक्ट है, जिसका कन्स्ट्रक्टर निष्पादित नहीं किया गया है। इसके बजाय ऑपरेटर new का उपयोग करने का प्रयास करें।

इसके अलावा, जब हम विषय पर हैं, सी ++ में, typedef structs की कोई आवश्यकता नहीं है, वे स्वचालित रूप से प्रथम श्रेणी के नाम बन जाएंगे।

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