CUDA程序抛出内存泄漏错误

时间:2011-08-15 15:48:33

标签: cuda parallel-processing nvidia

我不明白为什么以下简单代码在c [0] = d

时失败了
void test(char **a){
char **c;
cudaMemcpy(c,a, sizeof(char*), cudaMemcpyDeviceToHost);
char temp[2];
for(int i  = 0 ; i< 2; i++){
        temp[i ] = temp[i] & 0 ;
}
char *d;
cudaMalloc((void**)&d, 2*sizeof(char));
cudaMemcpy(d, temp, 2 * sizeof(char), cudaMemcpyHostToDevice);
c[0] = d;


}
void main(){

     char **a ;
    cudaMalloc((void**)&a, sizeof( char*));
    test(a);
}

2 个答案:

答案 0 :(得分:1)

您忘了为char **c分配内存。因此,在引起错误的行中,c是一个“死指针”,即等于NULL或指的是不属于您的程序的内存部分。换句话说,c指向一个空的,未分配的C字符串数组。解决c[0]元素(假设是数组中的第一个字符串,不存在)是非法的,并且会给你一个分段错误,因为你试图写一些东西(d的值)到你不拥有的地方。

解决方案是在写入c[0]之前分配内存:

c = new char *; //or "c = new char [5]"  if you want it to hold more strings
c[0] = d;

还记得你如何调用CudaMalloc()在GPU上为ad变量分配内存?您只需对c执行相同操作,但需要在主RAM中(即在主机上)

希望它有所帮助。

答案 1 :(得分:0)

首先,从代码中可以清楚地知道你要做什么,或许将其添加到Q中会有所帮助。那么你从编译器得到的错误信息到底是什么?

至于失败,可能是编译器不喜欢你试图使用c访问[],因为它没有被声明为数组。我原则上知道它应该有效,但尝试使用*c = d。这有帮助吗?

P.S。我个人总是使用命名法devFoo来指示设备内存的任何指针,所以我不会感到困惑,在一个更大的项目中,很容易忘记ab或{ {1}}指向主机或设备内存。