2012-05-11 11 views
5

मेरी सी ++ एल्गोरिदम जब मैं मॉड्यूल आयात करने के बाद अजगर दुभाषिया छोड़ने मैं लगातार इस त्रुटि मिलती है के लिए बड़ा घूँट में एक आवरण ऊपर लिखने के बाद:glibc का पता चला *** अजगर: डबल मुक्त या भ्रष्टाचार (! पिछला) बड़ा घूँट

$ python 
    iPython 2.5.6 (r256:88840, Mar 10 2012, 14:05:15) 
    [GCC 4.4.3] on linux2 
    Type "help", "copyright", "credits" or "license" for more information. 
    >>>from algol import * 
    >>> 
    *** glibc detected *** python: double free or corruption (!prev): 0x0000000001e42430 *** 

फिर मुझे नियंत्रण नियंत्रण प्राप्त करने के लिए Ctrl + C करना है ... क्या हो रहा है?

मैं अपने बड़ा घूँट रैपर बनाने के लिए निम्न कमांड चला रहा हूँ:

%module algol 
%{ 
#include "algol.hpp" 
%} 
%include "algol.hpp" 

आप इस बारे में क्या सोचते हैं:

$NAME=algol 
swig -c++ -python $NAME.i 
g++ -fpic -c $NAME.cpp $NAME.hpp $NAME\_wrap.cxx -I/usr/local/include/python2.5 
g++ -Xlinker -zmuldefs -shared $NAME.o $NAME\_wrap.o -o _$NAME.so 

मेरे बड़ा घूँट इंटरफ़ेस फ़ाइल सिर्फ एक algol.hpp के शामिल है ? : एस

संपादित करें: संलग्न नमूना स्रोत यहाँ कोड ->http://pastebin.com/q210vEAs

+0

आपके पास शायद आपके सी ++ एल्गोरिदम में मेमोरी लीक हो। एक उपकरण जैसे [वालग्रिंड] (http://www.valgrind.org) आपको ढूंढने में मदद कर सकता है। – Ken

+0

@ केन - बिल्कुल एक रिसाव की तरह नहीं लगता है। चीजों को दो बार मुक्त करने के बारे में चेतावनियों के साथ दुर्घटनाओं का कारण नहीं है! Valgrind अभी भी डबल फ्री के साथ मदद कर सकते हैं। – Flexo

+0

अधिक संभावना है कि आपने [तीन नियम] का उल्लंघन किया है (http://stackoverflow.com/questions/4172722/what-is-the-rule-of-three) कहीं और SWIG ने कोड उत्पन्न किया है जो आपकी कक्षाओं को अलग-अलग उपयोग करता है जिस तरह से आप उनका परीक्षण करेंगे इसका तरीका। (यदि आप कहीं भी एक उथले प्रतिलिपि करते हैं जो उस वर्ग में 'मुक्त() 'या' हटाएं 'वर्ग है तो यह वास्तव में इस परिदृश्य का कारण बन जाएगा)। हालांकि अधिक कोड देखने के बिना यह असंभव * हालांकि अटकलों से अधिक करना है। क्या आप एक * न्यूनतम * लेकिन पूरा उदाहरण बना सकते हैं जो आपकी समस्या का वर्णन करता है? (आपको ऐसा करने में समस्या भी मिल सकती है!) – Flexo

उत्तर

1

क्या हो रहा है?

वास्तव में संदेश क्या कहता है: या तो कुछ कोड डबल-फ्री या कुछ अन्य ढेर भ्रष्टाचार का प्रदर्शन करते हैं।

जैसा कि ऑवुडलैंड द्वारा सुझाया गया है, वालग्रिंड के तहत पाइथन चलाएं, और देखें जहां कि भ्रष्टाचार या डबल-फ्री हो रहा है।

+0

कई बार चलने के बाद, मुझे यह पता चला: स्विग/पायथन ने 'mln :: image2d *' की स्मृति स्मृति रिसाव का पता लगाया, कोई विनाशक नहीं मिला। मुझे लगता है कि मुझे एक विनाशक को लागू करना है, लेकिन मुझे यकीन नहीं है कि मुझे ऐसा करना है या ऐसा कैसे करना है .. – kersian

+1

@kersian नहीं: स्मृति रिसाव में समस्या के साथ कुछ भी नहीं है *। अपने वाल्ग्रिंड आउटपुट के साथ अपना प्रश्न अपडेट करें, और हम आपकी मदद करने में सक्षम हो सकते हैं। –