2011-11-12 18 views
8

बग ने मुझे लगभग दो दिनों तक परेशान किया: कोड चलाते समय मेरे पास एक सक्रिय अपवाद के बिना बुलाया जाने वाला टर्मटाइम त्रुटि है \ n निरस्त ",क्यूं कर?निम्न रनटाइम त्रुटि का अर्थ क्या है: "सक्रिय अपवाद के बिना बुलाया जाता है n निरस्त"

मैं कोड का पता लगाने की कोशिश करता हूं और लाइन को "xx = new int [num]" कोड से बाहर निकल सकता है, मेरे परीक्षण मामले में संख्या लगभग 640000 (64 एमबी मेमोरी नई) है। जब मैं 10 के रूप में बहुत छोटा अंक सेट करता हूं, तो यह ठीक है, लेकिन इस बार मेरे कोड को गलत जवाब मिलता है।

मैं सभी "कोशिश/पकड़" खंड को हटाने की कोशिश करता हूं लेकिन अभी भी यह त्रुटि है।

इसके अलावा मैं // सभी फ़ंक्शन जो "xx = new int [num]" खंड कहता हूं, त्रुटि अभी भी मौजूद है, और इस बार मुझे लगता है कि कोड बाहर निकल सकता है सामान्य "लूप के लिए" सामान्य है।

सभी मामले कंपाइलर को पारित कर दिया है, क्या आपने कभी अपना कोड चलाने में इस त्रुटि को पूरा किया है? धन्यवाद!

मैं कुछ नष्ट खंड // और नीचे त्रुटि मिलती है: पता चला * ./ESMF_RegridWeightGen * glibc: munmap_chunk(): अमान्य सूचक: 0x00000000005cd376 *

+1

एक 'कोशिश/catch' अपने पूरे' main' शरीर के चारों ओर ब्लॉक और देखो डालने की कोशिश करो अगर कोई अपवाद है ... –

+0

क्या आपके पास एक छोटा कोड नमूना है जो इस मुद्दे को प्रदर्शित करता है? –

+0

क्या आपके पास एकाधिक धागे हैं? – neagoegab

उत्तर

4

"एक सक्रिय बिना किसी अपवाद के समाप्त" संदेश एक संकेत है कि, आपके कार्यक्रम में किसी बिंदु पर, अपवाद हैंडलिंग टूट गई है।

स्मृति आवंटन शायद प्राथमिक कारण है, लेकिन शायद त्रुटि साइट नहीं है। बड़ा आवंटन एक std :: bad_alloc अपवाद फेंक देगा, और यह अपवाद कहीं गलत तरीके से संभाला जाता है।

सिद्धांत को मान्य करने के लिए, की तरह

throw std::logic_error("Foo"); 
आवंटन ऊपर

एक लाइन डालने, इस बग के रूप में अच्छी तरह से सक्रिय होना चाहिए।

मैं इस के लिए दो सामान्य कारणों का सामना किया है:

  • थ्रेड MinGW कार्यक्रमों सही झंडे के बिना संकलित
  • एक नाशक कि स्टैक की प्रक्रिया के हिस्से के रूप में बुलाया गया था एक अपवाद
दिया है

आपको डीबगर के साथ बाद की स्थिति का निदान करने में सक्षम होना चाहिए। आपके आवेदन का एक स्टैक ट्रेस (उदा। जीडीबी में इसे चलाकर प्राप्त) को बहुत मदद करनी चाहिए।

+0

~ 2.5 जीबी आवंटन के बारे में क्या? 640000 * आकार (int) – neagoegab

+2

@neagoegab: पिछली बार मैंने चेक किया, आकार (int) <10, तो 640,000 * आकार (int) <6,400,000 <6,4 MB। यह बहुत बड़ा हो सकता है और एक std :: bad_alloc फेंक सकता है। जिसके परिणामस्वरूप, सबसे खराब, एक समाप्ति कॉल में जो std :: bad_alloc को प्रिंट करता है, "सक्रिय अपवाद के बिना बुलाया जाता है" में नहीं। कहीं और भी बदतर समस्या है, और उसका बहुत बड़ा आवंटन बस इसे ट्रिगर कर रहा है। – thiton

+0

हाँ, आप सही हैं – neagoegab

7

जब मैंने फेंकने की कोशिश की तो मुझे इसका सामना करना पड़ा; एक पकड़ खंड के बाहर। रीथ्रो विफल रहता है और त्रुटि संदेश प्रदर्शित होता है।

+0

धन्यवाद, जिसने मुझे अभी बचाया है। – Etherealone

18

जब मैंने यह त्रुटि देखी है, तो यह थ्रेड ऑब्जेक्ट को अवरुद्ध करने से पहले थ्रेड ऑब्जेक्ट को नष्ट कर देता है।

+1

इसमें धागे के साथ कुछ भी नहीं हो सकता है। आपके पास स्थानीय ब्लॉक में 'std :: thread foo (...)' हो सकता है, और थ्रेड शुरू करने के बाद अपवाद फेंक सकता है। आपके अपवाद को पकड़ा जाने से पहले, धागा विनाशक होता है, और यह 'std :: terminate()' कहता है, जो वास्तविक अपवाद को डीबग करना मुश्किल बनाता है! –

1

मिनजीडब्ल्यू के साथ, -mthreads जीसीसी को संकलक विकल्प जोड़ने से इस समस्या को हल किया जाता है।

the gcc manual से

:

-mthreads

Mingw32 पर

समर्थन धागे की सुरक्षित अपवाद हैंडलिंग। कोड जो थ्रेड-सुरक्षित अपवाद हैंडलिंग पर निर्भर करता है उसे सभी कोड को -mthreads विकल्प के साथ संकलित और लिंक करना होगा। संकलन करते समय, -mthreads परिभाषित करता है -D_MT; लिंक करते समय, यह एक विशेष धागा सहायक लाइब्रेरी-लिंकिंगवर्थ में लिंक करता है जो प्रति थ्रेड अपवाद हैंडलिंग डेटा को साफ़ करता है।

2

गीरॉइड मर्फी की तरह कहा त्रुटि होता है जब धागा वस्तु से पहले धागा समारोह अपने आप में पूरी तरह से मार डाला जा चुका है विलुप्त है।

से पहले::

#include "tinythread.h" 
... 
void fork_thread(void (*function_pointer)(void * arg), void * arg_pointer) { 
    tthread::thread t(function_pointer, arg_pointer); 
    // t is destructed here, causing the "terminate called ..." error 
} 

के बाद: मैं tinythread पुस्तकालय (http://tinythreadpp.bitsnbites.eu/) का उपयोग कर इस त्रुटि का पता लगाया

#include "tinythread.h" 
... 
void fork_thread(void (*function_pointer)(void * arg), void * arg_pointer) { 
    tthread::thread * t = new tthread::thread(function_pointer, arg_pointer); 
    // now the new thread object is not destructed here, preventing 
    // the "terminate called ..." error. Remember that because thread 
    // object must now be destructed explicitly (i.e. manually) with delete 
    // call you should store the pointer t to a vector of thread pointers 
    // for example. 
}