重新解释<字符**> 来自新字符[]



所以我看到了这段让我困惑的代码:

class DynamicBuffer
{
private:

char* _buf = nullptr; 

public:
void Resize(size_t size)
{
char* resizeBuf = new char[size];
char **ptr = reinterpret_cast<char**>(resizeBuf);
*ptr = _buf;
_buf = resizeBuf;
}
}

我挂断了:

char **ptr = reinterpret_cast<char**>(resizeBuf);
*ptr = _buf;

我认为作者试图使第一个大小为(char(的字节指向旧的缓冲区,这是对的吗?这怎么不是未定义的行为?

为什么不这么做:

char** resizeBuf = new char*[size];

这似乎是基本上写的迂回版本

void Resize(size_t size)
{
assert(size >= sizeof(char*));
char* resizeBuf = new char[size];
memcpy((void*)resizeBuf, (void*)&_buf, sizeof(_buf));
_buf = resizeBuf;
}

或者使用新的放置来做本质上相同的事情。

void Resize(size_t size)
{
assert(size >= sizeof(char*));
char* resizeBuf = new char[size];
char** firstPointer = new(resizeBuf) char*;
*firstPointer = _buf;
_buf = resizeBuf;
}

我认为memcpy版本恰好定义良好,因为用新的__STDCPP_DEFAULT_NEW_ALIGNMENT__分配的内存的默认对齐方式应该容纳指针。

Memcpy还被允许隐式地创建新对象,这只是一个常规的赋值,如果没有之前的位置new,是不允许的。

最新更新