2

私はいくつかのCythonコードを持っています。これは、関連するドキュメントや他のいくつかのソース(たとえば、ここここ)で説明されているように、実際には外部Cライブラリのラッパーです。私は次のCythonクラス定義を持っています:

import numpy
cimport numpy
cimport clib # my C library

cdef class DoStuff:
    def __call__(self, array a):
        cdef numpy.ndarray[float, ndim=1] npa = numpy.ascontiguousarray(a)
        clib.cStuff( <float*>npa.data )

私のC関数(cStuff)は、コンパイルして他のCコードで実行すると、常に期待どおりに動作し、その戻り値は入力によって完全に決定されます(乱数の生成は含まれません)。CコードとPythonコードの両方が終了後に実行を終了するため、sを使用してヒープにfloat配列を割り当てますが、 sは割り当てmalloc()ません。ただし、Python内から関数を呼び出すと(5つのうち1つなど)、Cプログラムによって割り当てられたメモリが上書きされたかのように、メモリの破損が発生し、意味のない結果が返されることがあります。いずれの場合も正しい値が出力されるため、C関数が呼び出されても配列aは破損していません。何がこれを引き起こす可能性があるかについての考えはありますか?ありがとうございましたfree()cStuffcStuffcStuff

4

1 に答える 1

3

あなたの問題がどこにあるのかコードから推測することはできません。もっとコンテキストが必要です。

これを Valgrind で実行してみましたか?

http://valgrind.org/info/tools.html#memcheck

次のように実行します。

> valgrind python script.py

于 2013-02-15T22:16:51.037 に答える