是的,另一个realloc vs. std :: vector问题.我知道你要说什么,我同意,忘记手动内存分配,只需使用std :: vector.不幸的是,我的教授禁止我使用STL的任何东西进行这项任务.
所以是的,我有一个动态的T数组,我需要它可以调整大小,我不能使用std :: vector.我可以回到黑暗时代,用malloc和家庭来完成整个事情,但是如果我可以使用新的那将是非常棒的.
我已经阅读了大量的帖子,其中每个人都说“不,你不能这样做,使用std :: vector”,但是它们都是在2011年8月之前发布的,我希望自从有希望之后可能会有所改变. C 11的黎明.告诉我,我运气好,还是我必须恢复到C风格的内存分配?
解决方法
无论如何你应该完全避免重新分配,因为你不能像这样移动C对象.
>使用buf = new unsigned char [sizeof(T)* capacity]创建新缓冲区
>将分配的无符号字符*转换为T *,并从现在开始使用这些T指针
>通过“placement new”构建新元素,如new(& buf [i])T(original_copy)
>要将缓冲区复制到更大的缓冲区,首先分配新缓冲区,使用std :: uninitialized_copy(不是std :: copy),然后使用buf [i] .~T()销毁旧文件中的元素并取消分配使用delete [] buf的旧缓冲区.
所有这一切都假设您不必担心异常安全,这对于分配来说可能是可以的.请注意,在现实世界的代码中,您必须保证异常安全,而且比这更乏味.