面试题答案
一键面试在C++ 中,可以使用智能指针来确保异常安全,避免内存泄漏。以下是一个示例代码:
#include <memory>
#include <vector>
std::vector<int> createDynamicArray() {
// 使用std::unique_ptr来管理动态分配的数组
std::unique_ptr<int[]> dynamicArray(new int[10]);
// 模拟可能抛出异常的操作
if (/* 某些条件 */) {
throw std::runtime_error("Exception occurred");
}
// 将动态数组的数据转移到std::vector中
std::vector<int> result(dynamicArray.get(), dynamicArray.get() + 10);
// 释放unique_ptr对数组的控制权
dynamicArray.release();
return result;
}
在上述代码中:
- 使用
std::unique_ptr<int[]>
来管理动态分配的数组new int[10]
,这样在unique_ptr
的作用域结束时,会自动释放其所管理的内存,即使发生异常也能保证内存不会泄漏。 - 可以在函数中进行各种操作,若发生异常,
unique_ptr
会自动释放其管理的内存。 - 最后,将
unique_ptr
管理的数组数据转移到std::vector
中,std::vector
会接管数据的所有权,并负责其内存管理。
如果使用C++17及以上版本,还可以使用std::make_unique
来创建unique_ptr
,代码如下:
#include <memory>
#include <vector>
std::vector<int> createDynamicArray() {
// 使用std::make_unique来创建unique_ptr
auto dynamicArray = std::make_unique<int[]>(10);
// 模拟可能抛出异常的操作
if (/* 某些条件 */) {
throw std::runtime_error("Exception occurred");
}
// 将动态数组的数据转移到std::vector中
std::vector<int> result(dynamicArray.get(), dynamicArray.get() + 10);
// 释放unique_ptr对数组的控制权
dynamicArray.release();
return result;
}
这种方式更加简洁和安全,std::make_unique
会直接分配所需的内存并创建unique_ptr
,减少了潜在的内存泄漏风险。