Because std::make_unique<int[]>(100) performs value initialization while new int[100] performs default initialization – In the first case, elements are 0-initialized (for int), while in the second case elements are left uninitialized. Try:
int *p = new int[100]();
And you’ll get the same output as with the std::unique_ptr.
See this for instance, which states that std::make_unique<int[]>(100) is equivalent to:
std::unique_ptr<T>(new int[100]())
If you want a non-initialized array with std::unique_ptr, you could use1:
std::unique_ptr<int[]>(new int[100]);
1 As mentioned by @Ruslan in the comments, be aware of the difference between std::make_unique() and std::unique_ptr() – See Differences between std::make_unique and std::unique_ptr.