2016-12-04 1 views
0

Wenn ich ein Feld in Struktur bearbeite oder drucke bekomme ich den erwähnten Fehler wegen Speicherlecks, aber wenn ich mit einfachen Variablen wie xx arbeite, gibt es kein Speicherleck. Warum ist das?swig/python entdeckte einen Speicherverlust vom Typ 'uint32_t *', kein Destruktor gefunden

Datei rc_test.py:

import sys 
    import verbs_utils 
    import logging 
    logger = logging.basicConfig(level=logging.DEBUG) 

    class rc_pingpong(): 
     def __init__(self, link_partner_hostname=None): 
      self.attr = verbs_utils.ibv_qp_attr() 
      self.init_to_rts() 

     def init_to_rts(self): 
      self.attr = verbs_utils.ibv_qp_attr() 
      logging.debug("<DEBUG: init_to_rts>, self.attr = {}".format(self.attr)) 
      logging.debug("<DEBUG: init_to_rts>, self.attr.path_mtu = {}".format(self.attr.path_mtu)) 
      logging.debug("<DEBUG: init_to_rts>, self.attr.min_rnr_timer = {}".format(self.attr.min_rnr_timer)) 
      logging.debug("<DEBUG: init_to_rts>, self.attr.qp_state = {}".format(self.attr.qp_state)) 
      logging.debug("<DEBUG: init_to_rts>, self.attr.port_num = {}".format(self.attr.port_num)) 

      xx = self.attr.dest_qp_num 
      verbs_utils.set_intp_val(xx , 7) 
      verbs_utils.print_intp_val(xx) 
      self.attr.dest_qp_num = xx 
      #logging.debug("<DEBUG: init_to_rts>, +++++++++ self.attr.dest_qp_num = {}".format(self.attr.dest_qp_num)) 
      verbs_utils.print_intp_val(self.attr.dest_qp_num) 
      verbs_utils.print_intp_val(self.attr.dest_qp_num) 

Datei: verbs_utils.c

struct ibv_qp_attr { 
     uint32_t  qkey; 
     uint32_t  rq_psn; 
     uint32_t  sq_psn; 
     uint32_t  dest_qp_num; 
    }; 

    void set_intp_val(uint32_t* p, int val) 
    { 
     *p = val; 
     printf("----------------------------------------------\n"); 
     printf("<DEBUG : xxxxxxset_intp_val>, p = %d\n", p); 
     printf("<DEBUG : xxxxxxset_intp_val>, val = %d\n", val); 
     printf("<DEBUG : xxxxxxset_intp_val>, *p = %d\n", *p); 
     printf("----------------------------------------------\n"); 
    } 
    void print_intp_val(uint32_t* p) 
    { 
     printf("----------------------------------------------\n"); 
     printf("<DEBUG : xxxxxxset_intp_val>, *p = %d\n", *p); 
     printf("<DEBUG : xxxxxxset_intp_val>, p = %d\n", p); 
     printf("----------------------------------------------\n"); 
    } 

Ausgang:

---------------------------------------------- 
<DEBUG : xxxxxxset_intp_val>, p = 8431360 
<DEBUG : xxxxxxset_intp_val>, val = 7 
<DEBUG : xxxxxxset_intp_val>, *p = 7 
---------------------------------------------- 
---------------------------------------------- 
<DEBUG : xxxxxxset_intp_val>, *p = 7 
<DEBUG : xxxxxxset_intp_val>, p = 8431360 
---------------------------------------------- 
---------------------------------------------- 
<DEBUG : xxxxxxset_intp_val>, *p = 7 
<DEBUG : xxxxxxset_intp_val>, p = 8967344 
---------------------------------------------- 
swig/python detected a memory leak of type 'uint32_t *', no destructor found. 
---------------------------------------------- 
<DEBUG : xxxxxxset_intp_val>, *p = 7 
<DEBUG : xxxxxxset_intp_val>, p = 9753776 
---------------------------------------------- 
swig/python detected a memory leak of type 'uint32_t *', no destructor found. 

Antwort

2

Try %include "stdint.i" an die Spitze Ihrer Interface-Datei hinzufügen.

+0

Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert. - [Aus Bewertung] (/ review/low-quality-posts/17211784) – Omi

Verwandte Themen