我正在查看一些 C++ 代码,这些代码当前传递一个可以为 null 的 int* 数组并执行一些逻辑。假设它具有以下形式:
void modifyArray(int* arr = nullptr) {
if (arr) {
*arr += 10;
}
}
我知道这很容易出现内存泄漏,我正在尝试用现代 C++ 概念替换。据我了解,最佳实践是:
std::array
代替 int*
std::optional
防止空时使用我在实施这个概念时遇到了困难。我尝试了类似以下的内容(确切的逻辑并不重要):
void modifyArray(std::optional<std::array<int, 5>>& optArr = std::nullopt) {
if (optArr) {
for (auto& element : optArr.value()) {
element += 10;
}
}
}
但它无法编译,因为
std::nullopt
是一个常量 (Non-const lvalue reference to type 'std::optional<std::array<int, 5>>' cannot bind to a value of unrelated type 'const nullopt_t'
)。
我还没有找到一种方法来同时实现上述所有内容。这可行吗?
用我自己的非常量默认数组替换
std::nullopt
解决了我的问题,如下所示:
std::optional<std::array<int, 5>> DEFAULT_ARR;
void modifyArray(std::optional<std::array<int, 5>>& arr= DEFAULT_ARR) {
if (arr) {
for (auto& element : arr.value()) {
element += 10;
}
}
}
现在我可以调用两个版本了:
int main() {
modifyArray();
std::array<int, 5> arr = {1, 2, 3, 4, 5};
std::optional<std::array<int, 5>> optionalArr = arr;
modifyArray(optionalArr);
}
这里仍然有改进的空间,因为在我看来,不必在函数中定义这个额外的常量,并且如果这个函数的用户不必用
std::optional
包装他们的数组(以获得一个使用类似 C 的数组的更接近的经验),但这似乎确实有效 - modifyArray
的任何实现都允许修改数组的内容,并且它不能访问非法内存。