如何在c++中以非标准方式初始化动态内存

How to initialize a dynamic memory in a non-standard way in C++?

本文关键字:方式 初始化 动态 内存 非标准 c++      更新时间:2023-10-16

假设我有一个类:

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是一个CUDA API,用于分配GPU内存。

(忽略整体设计、异常安全等更大的问题,只关注最狭窄范围内的问题)

放弃在初始化列表中执行的想法,而在构造函数体中执行

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))
  {}

注意逗号表达式周围额外的一对(),这是满足初始化语法所需要的(否则,将被视为参数分隔符而不是逗号操作符)。

除了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在评论中指出的那样,请务必遵守三法则,以确保事情不会发生爆炸,而你浪费了你的周末时间来追踪难以调试的错误,而不是享受乐趣!