2017-03-18 73 views
0

關於std::align釋放指針::對齊

void* align(size_t alignment, size_t size, void*& ptr, size_t& space)

給定一個指針ptr到緩衝器[...]返回由指定的對齊排列的指針[...]。函數修改指針[...]

如果align成功,那麼返回的指針和ptr是相同的。

This SO answer節目傳遞,留下空間指針align,原來的指針存儲到超大塊,最後調用刪除對指針偏移地址。那是必要的,或者是它的安全簡單地做到這一點:

size_t space = 64; 
void* ptr = malloc(space); 
void* ret = std::align(alignment, targetSize, ptr, space); 
if (ret == nullptr) { /* failed to align */ } 
free(ptr); 
+0

請注意,在C++中沒有使用malloc;使用:: operator new而不是malloc。 –

+0

@TheTechel我與一個需要使用malloc進行分配的C庫進行交互,否則是。 – ZachB

回答

1

如果原來的指針是錯位也沒有辦法爲free()確定std::align()加上偏移的結果。內存分配算法很可能需要存儲一些元信息,這些元信息通常不能被恢復。

您將需要釋放原始指針。我很確定傳遞的指針不同於最初從malloc()獲得的指針,並且在調用free()時家族產生了未定義的行爲(同樣適用於其他內存管理工具)。

+1

請注意,有一些分配方案,分配內存中的指針就足夠了;依靠這一點,即使它工作,也不便攜或不可靠。 – Yakk