为什么 std::vector 没有释放方法?

Eme*_*pon 6 c++ stl vector std allocator

我发现自己处于这样一种情况,我希望有一个类似于unique_ptrs release()for的情况std::vector<>。例如:

std::vector<int> v(SOME_SIZE);

//.. performing operations on v

int* data = v.release(); // v.size() is now 0 and the ownership of the internal array is released
functionUsingAndInternallyDeletingRowPointer(data);
Run Code Online (Sandbox Code Playgroud)

有什么特殊原因不提供这种可能性吗?std::vector这会对内部实施施加一些限制吗?

或者有一种方法可以实现这一点,而我却尴尬地错过了?

Nic*_*las 6

函数UsingAndInternallyDeletingRowPointer

这个函数到底会做什么?因为该内存是通过调用分配的std::allocator_traits<std::allocator<T>>::allocate,因此希望通过调用将其删除std::allocator_traits<std::allocator<T>>::deallocate。此外, 的每个元素vector都是通过调用 来构造的std::allocator_traits<std::allocator<T>>::construct,因此必须通过调用 来销毁std::allocator_traits<std::allocator<T>>::destroy

如果该函数尝试对该指针执行操作delete [],它将无法工作。或者至少,它不需要工作

能够从 a 中提取内存缓冲区vector并直接使用它可能是合理的。但它不能只是一个指针。它必须有一个分配器。


小智 2

这可能会对 std::vector 的内部实现施加一些限制吗?

以下是一些允许这样做会发生冲突的示例:

  • 除非特殊情况,底层内存分配不能通过获得new T[],也不能通过 销毁delete[],因为它们会在已分配但实际上不应包含任何类型对象的内存上调用构造函数和析构函数T
  • 数组的开头实际上可能不是内存分配的开头;例如向量可以在数组开始之前存储簿记信息
  • vector销毁时可能不会真正释放内存;例如,分配可能来自实现用于快速创建和销毁小向量的小数组池。(此外,这些数组可能都只是一个更大数组的切片)