0

私はUbuntuでプログラミングしていPython 2.7.3ます.

CFFI を使用して、C コードから取得した値を Python リストに入力しています。
そのリストは非常に大きく、印刷すると約 71,000 文字になります。

C コードは多くのライブラリを使用しています。したがって、次のコードは、何が起こっているのかをよりよく理解するためにのみここに記載されています。

datas_list = []
for i in range( 0, x ):
    c_pDataStructure = ffi.new( "c_DataStructure[]", 1 )    // Create a pointer to the data structure
    c.SomeCFunction( c_pDataStructure )    // Populate the data structure
    datas_list.append( c.GetSomeInfo( c_pDataStructure ) )    // Get some info from the data structure
    c.FreeDataStructure( c_pDataStructure )    // Release dynamically allocated memory

このプログラムは、Wingware IDE を使用して適切に実行されますが*** glibc detected *** python: free(): invalid next size (fast): 0x0000000003b0b080 ***、コマンド ラインから開始すると、次の直前に glibc エラー ( ) で終了します。

c_pDataStructure = ffi.new( "c_Datastructure[]", 1)  

wim の回答を読んだ後、IDE とコマンド ラインの両方が同じインタープリターを使用してコードを実行しているかどうかを確認しました/usr/bin/python

編集 (valgrind レポート):

==5089== Process terminating with default action of signal 11 (SIGSEGV)  
==5089==  General Protection Fault  
==5089==    at 0x54FBB0: PyObject_Malloc (in /usr/bin/python2.7)  
==5089==    by 0x10B30625: allocate_owning_object (_cffi_backend.c:2972)  
==5089==    by 0x10B40EE8: allocate_with_allocator.constprop.84 (_cffi_backend.c:3032)  
==5089==    by 0x10B41010: direct_newp (_cffi_backend.c:3153)  
==5089==    by 0x10B4138C: b_newp (_cffi_backend.c:3177)  
==5089==    by 0x4F95A4: PyEval_EvalFrameEx (in /usr/bin/python2.7)  
==5089==    by 0x5008C1: PyEval_EvalCodeEx (in /usr/bin/python2.7)  
==5089==    by 0x4F9AB7: PyEval_EvalFrameEx (in /usr/bin/python2.7)  
==5089==    by 0x4F9D01: PyEval_EvalFrameEx (in /usr/bin/python2.7)  
==5089==    by 0x4F9D01: PyEval_EvalFrameEx (in /usr/bin/python2.7)  
==5089==    by 0x4F9D01: PyEval_EvalFrameEx (in /usr/bin/python2.7)  
==5089==    by 0x4F9D01: PyEval_EvalFrameEx (in /usr/bin/python2.7)

EDIT:
Cデータ構造に関する詳細情報を次に示します。これはそれがどのように見えるかです:

typedef struct _STRUCT3{
    some int, char*
}STRUCT3, *PSTRUCT3;

typedef struct _STRUCT2{
    some int
    PSTRUCT3 pStruct3;
}STRUCT3, *PSTRUCT3;

typedef struct _STRUCT1{
    some int, char*
    PSTRUCT2 pStruct2;
}STRUCT1, *PSTRUCT1;

完全な C 構造体を割り当て/割り当て解除する小さな C プログラムを作成しましたがvalgrind、メモリ リークは見つかりませんでした。

質問:

  • 上記のvalgrindレポートは正確には何を意味するのでしょうか?
  • プログラムを IDE から実行する場合とコマンド ラインから実行する場合の違いは何ですか?
    注: IDE は Python 引数-u (unbuffered)を使用してプログラムを実行しますが、コマンド ラインに追加しても違いはありません。
  • 自分で構造体の割り当てを解除すると、Python のガベージ コレクターが動作しますか? ffi.gc( c_pDataStructure, c.FreeDataStructure )代わりに使うべきですか?
4

2 に答える 2

0

これは、Coverity が CFFI で生成されたコードの一部で見つけた次のバグにも関連している可能性があります。

  x0 = (void *)alloca((size_t)datasize);
  ...
  { 
      free(x0); 
  }

ご覧のとおり、スタック割り当てメモリで free を呼び出しています。

于 2016-09-08T19:41:00.497 に答える