【问题标题】:Freeing pointer from std::align从 std::align 中释放指针
【发布时间】:2017-08-10 04:48:30
【问题描述】:

关于std::align

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

给定一个指向缓冲区的指针ptr [...] 返回一个按指定对齐方式对齐的指针 [...]。该函数修改指针[...]

如果align成功,那么返回的指针和ptr是一样的。

This SO answer 显示传递一个偏移地址,为指向align 的指针留出空间,存储指向超大块的原始指针,最后在 original 指针上调用 delete。是否有必要,或者简单地这样做是否安全:

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

【问题讨论】:

  • 注意C++中没有使用malloc;使用 ::operator new 而不是 malloc。
  • @TheTechel 我正在与一个需要使用 malloc 分配的 C 库进行交互,否则是的。

标签: c++ c++11


【解决方案1】:

如果原始指针未对齐,free() 将无法确定 std::align() 添加的结果的偏移量。内存分配算法很可能需要在分配时存储一些通常无法恢复的元信息。

您需要释放原始指针。我很确定在调用free() 时传递的指针与最初从malloc() 和family 获得的指针不同,会产生未定义的行为(对于其他内存管理工具也是如此)。

【讨论】:

  • 请注意,有些分配方案中,分配内存中的指针就足够了;依靠它,即使它有效,也不可移植或可靠。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-24
  • 1970-01-01
  • 1970-01-01
  • 2021-09-15
  • 1970-01-01
相关资源
最近更新 更多