对主机使用free会导致分段错误

我有一个内核的cu文件,如:

__global__ void kernel(float* A,float *B, curandState* globalState,int Asize,int Bsize) { .... } void kernel_wrapper(float** A_host,float** B_host, int Asize ,int Bsize) { ... //allocate host memory *A_host=(float*)malloc(Asize*sizeof(float)); *B_host=(float*)malloc(Bsize*sizeof(float)); //allocate device memory float* A_dev,*B_dev; gpuErrchk(cudaMalloc((void**) &A_dev,Asize* sizeof(float))); gpuErrchk(cudaMalloc((void**) &B_dev,Bsize* sizeof(float))); // copy arrays from host to device gpuErrchk(cudaMemcpy(A_dev, *A_host,Asize* sizeof(float), cudaMemcpyHostToDevice)); gpuErrchk(cudaMemcpy(B_dev, *B_host,Bsize* sizeof(float), cudaMemcpyHostToDevice)); .... kernel<<>>(A_dev,B_dev, devStates,Asize,Bsize); // copy result from device to host gpuErrchk(cudaMemcpy(*A_host, A_dev,Asize* sizeof(float), cudaMemcpyDeviceToHost)); gpuErrchk(cudaMemcpy(*B_host, B_dev,Bsize* sizeof(float), cudaMemcpyDeviceToHost)); //clean up device memory gpuErrchk(cudaFree(A_dev)); gpuErrchk(cudaFree(B_dev)); gpuErrchk(cudaFree(devStates)); //clean up host memory free(*A_host); free(*B_host); } 

和我调用内核的cpp文件:

 ... extern void kernel_wrapper(float** A,float** B, int Asize ,int Bsize); ... int main() { ... float* A; float* B; ... kernel_wrapper(&A,&B,Asize ,Bsize); ... free(A); free(B); 

现在,使用

 free(*A_host); free(*B_host); 

在cu文件中导致

分段故障

如果我使用cudaFree或cudaFreeHost(这是不对的,因为我使用alloc分配),它会显示“无效设备指针”或“无效参数”。

如果我根本不使用免费,程序运行正常。

为什么这是关于这些内存分配的适当过程?

你在相同的指针上调用free()两次,这是无效的。 这段代码中的内存管理很奇怪而且令人困惑。

我想删除kernel_wrapper()函数中的free()调用是最有意义的。 因为它被设置为返回指向调用者的指针,所以free()函数中的内存是没有意义的。