说我有课:
class A
{
private:
const int * const v;
public:
A();
}
我希望在初始化列表中分配v
,我想我可以定义以下构造函数:
A::A():v((int*)malloc(10*sizeof(int))){}
然而,必须以非标准的方式分配v,如下所示:
cudaMalloc(&v,10*sizeof(int));
注意cudaMalloc
是用于分配GPU内存的CUDA API。
答案 0 :(得分:8)
(忽略整体设计,异常安全等更大的问题,并关注最狭窄范围内的问题)
放弃在初始化列表中执行的想法,而不是在构造函数体中执行
A::A() : v(NULL)
{
cudaMalloc(&v, 10 * sizeof(int));
}
或者,或者,将分配函数包装到您自己的函数中返回指针
void *wrapped_cudaMalloc(size_t size)
{
void *m = NULL;
cudaMalloc(&m, size);
return m;
}
...
A::A() : v(wrapped_cudaMalloc(10 * sizeof(int)))
{}
只是为了完整起见,在初始化列表中执行此操作还有一种丑陋的方式,而不通过利用,
运算符
A::A() : v((cudaMalloc(&v, 10 * sizeof(int)), v))
{}
注意逗号表达式周围的另外一对()
,这是满足初始化语法所需的(否则,
将被视为参数分隔符而不是逗号运算符)。
答案 1 :(得分:3)
除了AndreyT的优秀帖子(以及他对逗号运算符的创造性使用)之外,您还可以这样做:
class cudaMallocedInt
{
private:
int *v;
public:
cudaMallocedInt(int n)
{
cudaMalloc(&v, n * sizeof(int));
}
cudaMallocedInt(const cudaMallocedInt &o)
{
// Do whatever is appropriate here. Probably some sort of dance.
}
~cudaMallocedInt()
{
// Remember to cudaFree or whatever
}
operator int*()
{
return v;
}
};
class A
{
private:
cudaMallocedInt v;
public:
A()
: v(10)
{
}
...
};
更新:正如Johnsyweb在评论中指出的那样,请务必遵守Rule of Three以确保不会出现繁荣而浪费你的周末跟踪难以调试错误而不是玩得开心!