面试题答案
一键面试- 确保内存安全和避免悬空指针:
- 在
handle
函数内部,std::unique_ptr<int[]>
会在函数结束时自动释放其所管理的内存,所以一般情况下不会产生悬空指针。但是如果对ptr
进行释放操作,需要确保不再使用它。 - 以下是代码示例:
- 在
#include <memory>
#include <iostream>
class MyClass {
public:
void handle(std::unique_ptr<int[]> ptr) {
// 这里可以对ptr进行操作,比如释放内存
ptr.reset(); // 释放内存,ptr变为nullptr,避免悬空指针
}
};
- 解释:
std::unique_ptr
的设计理念就是自动管理动态分配的内存。当ptr
离开其作用域(即handle
函数结束)时,std::unique_ptr
的析构函数会自动释放其所指向的内存。如果在函数内部调用reset
,会立即释放当前管理的内存,并将ptr
置为nullptr
,这样就避免了悬空指针问题。
- 函数需要返回
ptr
时的资源管理设计:- 当函数需要返回
ptr
时,std::unique_ptr
能够完美地进行资源转移。std::unique_ptr
支持移动语义,这使得在返回时资源的所有权能够安全地转移。 - 以下是代码示例:
- 当函数需要返回
#include <memory>
#include <iostream>
class MyClass {
public:
std::unique_ptr<int[]> handle(std::unique_ptr<int[]> ptr) {
// 这里可以对ptr进行操作,比如重新分配内存
ptr.reset(new int[5]);
for (int i = 0; i < 5; i++) {
ptr[i] = i;
}
return ptr; // 移动语义,将ptr的所有权返回
}
};
- 解释:在
handle
函数中,ptr
重新分配了内存并进行了初始化。当return ptr
时,std::unique_ptr
使用移动语义将资源的所有权从函数内部的ptr
转移到函数调用者。这意味着不会进行内存的拷贝,而是直接将内部指针和相关资源转移,从而保证了资源的正确管理。调用者接收到返回的std::unique_ptr
后,就拥有了对这块内存的唯一所有权,并且在其析构时会正确释放内存。
可以这样测试上述代码:
int main() {
MyClass obj;
std::unique_ptr<int[]> temp(new int[3]);
std::unique_ptr<int[]> result = obj.handle(std::move(temp));
if (result) {
for (int i = 0; i < 5; i++) {
std::cout << result[i] << " ";
}
std::cout << std::endl;
}
return 0;
}
在main
函数中,我们创建了一个临时的std::unique_ptr<int[]>
,并通过std::move
将其所有权转移到handle
函数中,handle
函数返回的std::unique_ptr<int[]>
被result
接收,然后我们可以使用result
来访问分配的内存。