我的任务是在模板中为通用类型 T 创建一个缓冲区。我得到了一个分配的字符数组,我应该在不使用 STL 的情况下将其转换为缓冲区。
我对其中的一些还很陌生,我不知道如何获取该内存并将其转换为 T 数组(知道类型 T 占用了多少空间)。我试过弄乱地址,但这似乎不起作用。
有人能帮我吗?
要在原始内存和对象之间进行转换,您需要以放置形式构造对象,这与new
操作符一样。除非您正在编写专用的容器类,否则这通常不是您应该做的事情,但方法如下:
char memory[sizeof(T) * 10]; // gives pointers to raw memory
T * objects[10]; // stores pointers to objects
for (unsigned int i = 0; i != 10; ++i)
{
objects[i] = new (memory + i * sizeof(T)) T; // even better: "::new"
}
然后删除:
for (unsigned int i = 0; i != 10; ++i)
{
objects[i]->~T();
}
这在各种方面仍然是非常错误和糟糕的,但这是一个开始。
不要这样做。
(这有两个问题:a)您需要保证内存的适当对齐。b)您需要考虑如果任何构造函数T
抛出异常会发生什么。)