我已经用Python编写了C ++扩展,我正在调试它。 扩展需要3个numpy矩阵,结果产生2个。对于执行实际计算的内部C ++函数,我传递了3个float C数组(刚刚平坦化并从输入numpy数组转换),并返回一个C float数组。如果我在返回之前打印这个数组输出数组,那么一切都按预期工作,但仅。
这到底是怎么回事?
float** gradient(float* inputs, float* kernels, float* grads, npy_intp* input_dims, npy_intp* kernels_dims, npy_intp* output_dims){
float* g_inputs = new float[batch*h*w*ch_in];
for (int i = 0; i < batch*h*w*ch_in; i++) g_inputs[i] = 0;
float* g_kernels = new float[size*ch_out];
for (int i = 0; i < size*ch_out; i++) g_kernels[i] = 0;
float* ret[2] = {{g_inputs}, {g_kernels}};
std::cout<<ret<<std::endl; //<---without this it doesn't work
return ret;
}
为清楚起见,我省略了不相关的代码。
答案 0 :(得分:3)
您正在返回一个指向具有自动生命周期的对象的指针。换句话说,您的函数返回一个悬空指针,即未定义的行为。
虽然空气静力蜥蜴是UB不常见的结果,任何事情都可能发生,与蜥蜴不同,你观察到的症状很常见。