2011-09-22 16 views
6

वालग्रिंड एक सबस्ट्रोक आमंत्रण के साथ शिकायत कर रहा है।इस वालग्रिंड त्रुटि का कारण क्या है?

string Message::nextField(string& input) { 
    int posSeparator = input.find_first_of(SEPARATOR); 
    string temp; 
    temp = input.substr(0, posSeparator); //Error points to this line 
    input.erase(0, posSeparator + 1); 
    return temp; 
} 

त्रुटि चला जाता है: 12 ब्लॉकों में
290 बाइट्स निश्चित रूप से की 1 1
क्या समारोह मूल रूप से इनपुट को पार्स किया जाता है, विभाजक वर्ण द्वारा अलग स्ट्रिंग के कुछ भागों लौटने करता हार का रिकॉर्ड में खो जाते हैं। यह समारोह अगले परिभाषा के साथ एक और वर्ग की विधि से शुरू हो जाती है:

void doSomething(string input) { 
    input.erase(0,2); 
    string temp = nextField(input); 
    this->room = atoi(temp.c_str()); 
    temp = input; 
    this->money = atoi(temp.c_str()); 
} 

अजीब या बहुत महत्वपूर्ण यहाँ शामिल होने के लिए और कुछ नहीं है। मैं एक्लिप्स इंडिगो की वालग्रिंड प्रोफाइलिंग से वालग्रिंड के लिए डिफ़ॉल्ट सेटअप का उपयोग करता हूं। कोई विचार?

+3

क्या आप संकलन के दौरान अनुकूलित कर रहे हैं? यदि हां, तो मत करो। यह valgrind से बहुत नकली रिपोर्ट का कारण बनता है। –

+0

आप शायद 'स्ट्रिंग temp = input.substr (0, posSeparator) लिख सकते हैं;' इसे निर्दिष्ट करने के बजाय स्ट्रिंग को प्रारंभ करने के लिए। यह स्पष्ट नहीं है कि आपकी समस्या के साथ कुछ भी करना है। –

+0

@ डेविड हैममेन नहीं, मैं नहीं हूं। – Erandros

उत्तर

0

आप की जाँच नहीं करते हैं तो posSeparator वास्तव में स्ट्रिंग :: एनपीओ से अलग है - यह मिटा में समस्याएं पैदा कर सकता है। यह एक जंगली शॉट है, लेकिन यह किसी भी तरह से एक बग ठीक हो सकता है।

1

आपके पास शायद आपके स्रोत में कहीं और त्रुटि है।

#include <string> 
#include <iostream> 
#include <cstdlib> 

using namespace std; 

const char SEPARATOR = ':'; 

struct Foo 
{ 
public: 
    int room; 
    int money; 

    void doSomething(string input) { 
     input.erase(0,2); 
     string temp = nextField(input); 
     this->room = atoi(temp.c_str()); 
     temp = input; 
     this->money = atoi(temp.c_str()); 
    } 

    string nextField(string& input) { 
     int posSeparator = input.find_first_of(SEPARATOR); 
     string temp; 
     temp = input.substr(0, posSeparator); //Error points to this line 
     input.erase(0, posSeparator + 1); 
     return temp; 
    } 
}; 

int main() 
{ 
    Foo f; 
    f.doSomething("--234:12"); 
    std::cout << f.room << " - " << f.money << std::endl; 
} 

फिर valgrind एक चलाया:: मैं निम्नलिखित कोड का उपयोग कर त्रुटि दोहराने की कोशिश की

valgrind --tool=memcheck <executable> 

और आउटपुट था:

HEAP SUMMARY: 
    in use at exit: 0 bytes in 0 blocks 
    total heap usage: 2 allocs, 2 frees, 61 bytes allocated 

All heap blocks were freed -- no leaks are possible 

For counts of detected and suppressed errors, rerun with: -v 
ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 4 from 4) 

तो, शायद आपकी समस्या में नहीं है कोड

2

का यह हिस्सा शायद यह आपके कोड में एक बग नहीं है। सी ++ मानक पुस्तकालय के कार्यान्वयन के विवरण के कारण यह त्रुटि रिपोर्ट की जा सकती है। इस Valgrind FAQ से निम्न प्रयास करें सत्यापित करने के लिए:

जीसीसी 2.91, 2.95, 3.0 और 3.1 के साथ, -D__USE_MALLOC साथ एसटीएल का उपयोग कर सभी स्रोत संकलन। सावधान रहें! इसे संस्करण 3.3 से शुरू होने वाले जीसीसी से हटा दिया गया था।

जीसीसी 3.2.2 के साथ और बाद में, आपको अपने प्रोग्राम चलाने से पहले पर्यावरण चर GLIBCPP_FORCE_NEW निर्यात करना चाहिए।

जीसीसी 3.4 और बाद में, उस चर ने नाम बदलकर GLIBCXX_FORCE_NEW कर दिया है।

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