MST

星途 面试题库

面试题:C++ 中指针作为函数参数的内存释放问题

假设有如下C++代码: ```cpp #include <iostream> void func(int* ptr) { ptr = new int(5); } int main() { int* p = nullptr; func(p); std::cout << *p << std::endl; delete p; return 0; } ```这段代码会出现什么问题?如何修改才能正确实现内存的分配与释放,并输出指针指向的值?
33.5万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 问题分析
    • func 函数中,ptrmain 函数中 p 的一个拷贝。ptr = new int(5); 这行代码只是修改了 ptr 指针本身,使其指向新分配的内存,但并没有改变 main 函数中 p 指针的值,所以 main 函数中的 p 仍然是 nullptr。当执行 std::cout << *p << std::endl; 时,会导致空指针解引用,这是未定义行为。并且,由于 p 仍然是 nullptrdelete p; 也是未定义行为。
  2. 修改方法
    • 可以通过传递指针的指针或者引用的方式来修改 main 函数中的指针。
    • 方法一:传递指针的指针
#include <iostream>
void func(int** ptr) {
    *ptr = new int(5);
}
int main() {
    int* p = nullptr;
    func(&p);
    std::cout << *p << std::endl;
    delete p;
    return 0;
}
  • 方法二:传递引用
#include <iostream>
void func(int*& ptr) {
    ptr = new int(5);
}
int main() {
    int* p = nullptr;
    func(p);
    std::cout << *p << std::endl;
    delete p;
    return 0;
}

在这两种修改后的代码中,都能正确地分配内存,输出指针指向的值,并在使用完毕后释放内存。