例如 -
#include <memory>
int main(){
const auto bufSize = 1024;
auto buffer = std::make_unique<char[]>(bufSize);
}
此处的缓冲区是否已填充'\0'
个字符,或者我必须手动填充它以避免垃圾值。
这样做的可行方法是什么,std::memset(&buffer.get(), 0, bufSize)
会满足吗?
答案 0 :(得分:16)
如果您不提供构造函数参数,则所有make_*
函数都会对该类型使用值初始化。由于make_unique
的数组形式不接受任何参数,因此它会将元素清零。
答案 1 :(得分:5)
是的,所有元素都是value initialized std::make_unique。
该功能相当于:
unique_ptr<T>(new typename std::remove_extent<T>::type[size]())
和
值初始化
这是构造变量时执行的初始化 使用空的初始化程序。
语法
new T (); (2)
和
值初始化的影响是:
3)如果
T
是数组类型,则数组的每个元素都是 值初始化;
4)否则,对象被零初始化。
然后对于char
类型的每个元素,它们将被初始化(零初始化)为'\0'
。
答案 2 :(得分:4)
根据cppreference,是的:
2)构造一个未知边界T的数组。如果T是未知边界的数组,则此重载仅参与重载解析。该功能相当于:
unique_ptr<T>(new typename std::remove_extent<T>::type[size]()) value initialization ^
我指出的值初始化。