如何在c++中以非标准方式初始化动态内存
How to initialize a dynamic memory in a non-standard way in C++?
假设我有一个类:
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在评论中指出的那样,请务必遵守三法则,以确保事情不会发生爆炸,而你浪费了你的周末时间来追踪难以调试的错误,而不是享受乐趣!
相关文章:
- Constexpr替代了新的放置方式,可以让内存中的对象保持未初始化状态
- 为什么C++有不同的变量初始化方式?
- 为什么两种不同的对象初始化方式给出不同的输出
- 以这种方式初始化的 char 数组是否会自动添加空终止符?
- C++中数据初始化的不同方式
- 用初始化列表和超类构造函数声明子类构造函数的正确方式
- 在 C 语言中初始化 List<List> 的优雅方式<Coordinate>#
- 是否可以以编程方式初始化 constexpr std::array 成员
- 初始化结构的两种方式
- 如何以包装的方式初始化布局,从而减少布局之间的空间
- 高效而优雅的矢量初始化方式
- 卡在理解以下初始化方式shared_ptr
- 在现代C++中初始化字符串的方式是否有不同
- 如何使用构造函数以类似的方式初始化"对象数组"
- C++:以编程方式初始化输入
- 子类如何调用以不同方式初始化成员变量的父类的构造函数?[C++]
- 在编译或初始化时以编程方式初始化长数组
- 如何在c++中以非标准方式初始化动态内存
- 用两种不同的方式初始化指针会得到两种结果
- 需要以编程方式初始化类变量数组,我怎么做最好