R.5 (scoped objects): Do not warn on a const unique_ptr<T[]> (#1969)

`unique_ptr<T[]>` is being used in practice to declare a local dynamically allocated buffer.
This commit is contained in:
Niels Dekker
2022-10-13 23:08:53 +02:00
committed by GitHub
parent 40ce5d12c3
commit f4a9420e32

View File

@@ -9564,6 +9564,28 @@ Instead, use a local variable:
* (Moderate) Warn if an object is allocated and then deallocated on all paths within a function. Suggest it should be a local stack object instead. * (Moderate) Warn if an object is allocated and then deallocated on all paths within a function. Suggest it should be a local stack object instead.
* (Simple) Warn if a local `Unique_pointer` or `Shared_pointer` is not moved, copied, reassigned or `reset` before its lifetime ends. * (Simple) Warn if a local `Unique_pointer` or `Shared_pointer` is not moved, copied, reassigned or `reset` before its lifetime ends.
Exception: Do not produce such a warning on a local `Unique_pointer` to an unbounded array. (See below.)
##### Exception
It is OK to create a local `const unique_ptr<T[]>` to a heap-allocated buffer, as this is a valid way to represent a scoped dynamic array.
##### Example
A valid use case for a local `const unique_ptr<T[]>` variable:
int get_median_value(const std::list<int>& integers)
{
const auto size = integers.size();
// OK: declaring a local unique_ptr<T[]>.
const auto local_buffer = std::make_unique_for_overwrite<int[]>(size);
std::copy_n(begin(integers), size, local_buffer.get());
std::nth_element(local_buffer.get(), local_buffer.get() + size/2, local_buffer.get() + size);
return local_buffer[size/2];
}
### <a name="Rr-global"></a>R.6: Avoid non-`const` global variables ### <a name="Rr-global"></a>R.6: Avoid non-`const` global variables