【发布时间】:2019-01-06 03:19:19
【问题描述】:
我在 Cython 中有一个使用 char * 成员的数据结构。
发生的情况是成员值似乎失去了在为成员分配值的函数之外的范围。请参阅此示例(使用 IPython):
[nav] In [26]: %%cython -f
...: ctypedef struct A:
...: char *s
...:
...: cdef char *_s
...:
...: cdef void fn(A *a, msg):
...: s = msg.encode()
...: a[0].s = s
...:
...: cdef A _a
...: _a.s = _s
...: fn(&_a, 'hello')
...: print(_a.s)
...: print(b'hola')
...: print(_a.s)
b'hello'
b'hola'
b"b'hola'"
看起来_a.s 在fn 之外被释放,并且被分配了内存中适合该插槽的任何垃圾。
这仅在特定情况下发生。例如,如果我将 b'hello' 分配给 s 而不是 fn() 内的编码字符串,则正确的字符串将在函数外部打印。
如您所见,我还为 char 变量添加了一个额外的声明,并在执行 fn 之前将其分配给 struct,以确保 _a.s 指针不会超出范围。但是,我怀疑问题是将成员分配给函数范围内的变量。
这里到底发生了什么,我该如何解决这个问题?
谢谢。
【问题讨论】: