从扩展函数返回后使用自定义Python扩展的堆损坏(0xC0000374)

从扩展函数返回后使用自定义Python扩展的堆损坏(0xC0000374),python,c++,windows,numpy,Python,C++,Windows,Numpy,我正在为我的Python脚本编写一个扩展模块,但无法确定堆损坏的来源。 扩展模块的使用应该是创建一个Numpy数组,用一些给定条件计算的值填充它,然后将Numpy数组返回给Python。 有一个Python函数(在下面的示例中get_data()),它包装扩展函数并从中接收Numpy数组。 当Python函数返回时,会发生错误 当我使用“OOO”而不是“NNN”作为Py\u BuildValue()的格式字符串时,不会发生错误 因此,我假设这是一个关于引用计数的问题。如果您查看下面的示例代码,这

我正在为我的Python脚本编写一个扩展模块,但无法确定堆损坏的来源。 扩展模块的使用应该是创建一个Numpy数组,用一些给定条件计算的值填充它,然后将Numpy数组返回给Python。 有一个Python函数(在下面的示例中
get_data()
),它包装扩展函数并从中接收Numpy数组。 当Python函数返回时,会发生错误

当我使用
“OOO”
而不是
“NNN”
作为
Py\u BuildValue()
的格式字符串时,不会发生错误

因此,我假设这是一个关于引用计数的问题。如果您查看下面的示例代码,这个问题大家都熟悉吗

开始使用WinDbg,但完全是初学者

注意:不幸的是,我们无法共享原始代码,这当然会使这一点更加困难。下面的示例代码没有给我带来任何错误,但是它使用了相同的概念,问题可能就在这里

模块.cpp

#定义PY\u-SSIZE\u-T\u-CLEAN
#定义NPY\u否\u已弃用\u API NPY\u API\u版本
#包括
#包括
//帮助对数据阵列进行一些示例性更改
void applySomeChangesOnData(双*数据、双因子、大小列、大小列){
对于(int m=0;m
setup.py

导入操作系统
导入系统
从setuptools导入设置、扩展,查找\u包
#获取Python解释器的安装路径
(path_解释器,_)=os.path.split(sys.executable)
ext\u module=Extension('example\u package.Extension',
sources=['example_package/module.cpp',],
include_dirs=[os.path.join(path_解释器'Lib/site packages/numpy/core/include'),
额外编译参数=['/Zi'],
额外链接参数=['/DEBUG'])
设置(
name='example_package',
version='0.1',
ext_模块=[ext_模块],
)
debug_extension.py

将numpy导入为np
从示例_package.extension导入创建_数组
形状=(40006000)
def get_data():
#在此列表中写入5对数组
列表_对=[]
对于范围(50)内的i:
#从扩展中获取3个数组
(arr1、arr2、arr3)=创建_数组(形状)
#使用np.stack()对它们进行重塑、转置,然后再进行组合
arr1=np.重塑(arr1,shape).transpose()
arr2=np.reformate(arr2,shape).transpose()
arr3=np.重塑(arr3,shape).transpose()
list_pairs.append([
np.堆栈([arr1,arr2],轴=0),
np.堆栈([arr1,arr3],轴=1),
])
返回列表\u对
list_pairs=获取_数据()
请出示一张照片。你不会得到我们无法重现的问题的解决方案。