面试题答案
一键面试-
发生的情况及内存管理问题:
- 在
getResource
函数中,创建了一个局部变量res
为Resource
类型。当函数返回时,这个局部变量res
会被销毁,因为其生命周期在函数结束时结束。 - 然而,函数
getResource
返回了对这个局部变量res
的引用。当useResource(getResource())
调用时,getResource
返回的引用指向的是一个已经被销毁的对象。这会导致未定义行为,因为useResource
试图使用一个无效的引用。
- 在
-
修改代码以确保内存正确管理的方法:
- 方法一:返回对象而不是引用
class Resource {
public:
Resource() { std::cout << "Resource created" << std::endl; }
~Resource() { std::cout << "Resource destroyed" << std::endl; }
};
Resource getResource() {
Resource res;
return res;
}
void useResource(const Resource& res) {
// do something
}
- 方法二:使用智能指针
#include <memory>
class Resource {
public:
Resource() { std::cout << "Resource created" << std::endl; }
~Resource() { std::cout << "Resource destroyed" << std::endl; }
};
std::shared_ptr<Resource> getResource() {
std::shared_ptr<Resource> res = std::make_shared<Resource>();
return res;
}
void useResource(const std::shared_ptr<Resource>& res) {
// do something
}
在调用 useResource(getResource())
时,第一种方法会进行对象拷贝(现代编译器可能会进行返回值优化,避免不必要的拷贝)。第二种方法使用 std::shared_ptr
来管理资源,getResource
返回的 std::shared_ptr
会在 useResource
结束或者最后一个指向该资源的 std::shared_ptr
被销毁时,自动释放资源。