MST

星途 面试题库

面试题:C++ 按常量引用传递与临时对象的内存管理

考虑以下代码片段: ```cpp class Resource { public: Resource() { std::cout << "Resource created" << std::endl; } ~Resource() { std::cout << "Resource destroyed" << std::endl; } }; const Resource& getResource() { Resource res; return res; } void useResource(const Resource& res) { // do something } ``` 调用 `useResource(getResource())` 会发生什么?解释内存管理问题,并说明如何修改代码以确保内存正确管理。
12.0万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 发生的情况及内存管理问题

    • getResource 函数中,创建了一个局部变量 resResource 类型。当函数返回时,这个局部变量 res 会被销毁,因为其生命周期在函数结束时结束。
    • 然而,函数 getResource 返回了对这个局部变量 res 的引用。当 useResource(getResource()) 调用时,getResource 返回的引用指向的是一个已经被销毁的对象。这会导致未定义行为,因为 useResource 试图使用一个无效的引用。
  2. 修改代码以确保内存正确管理的方法

    • 方法一:返回对象而不是引用
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 被销毁时,自动释放资源。