【问题标题】:Is const char* automatically deleted when it is passed as an argument?const char* 作为参数传递时会自动删除吗?
【发布时间】:2026-02-06 08:10:01
【问题描述】:

当我将const char* 作为函数参数传递时(像这样):

void print(const char* text)
{
     std::cout << text << std::endl;
}

会自动删除吗?如果没有,它会发生什么,我应该如何删除它?

【问题讨论】:

    标签: c++ pointers memory-management string-literals const-char


    【解决方案1】:

    指针变量是指向其他内存的变量。

    当您将指针作为参数传递给函数时,会复制指针本身,但不会复制它指向的内存。因此没有什么可以“删除”的。


    让我们来看这个简单的示例程序:

    #include <iostream>
    
    void print(const char* text)
    {
         std::cout << text << std::endl;
    }
    
    int main()
    {
        const char* text = "foobar";
    
        print(text);
    }
    

    main 函数运行时,您会看到如下内容:

    +------------------------+ +------------+ |主函数中的文本 | --> | “富吧” | +------------------------+ +------------+

    那么当print 函数被调用并运行时,它就有了自己的指针副本:

    +------------------------+ |主函数中的文本 | -\ +-----------+ \ +----------+ >--> | “富吧” | +------------+ / +------------+ |打印功能中的文本| -/ +------------------------+

    两个变量指向同一个内存。

    此外,像上面示例中的 "foobar" 这样的文字字符串将永远需要被删除或释放,它们由编译器管理并存在于程序的整个运行时.

    【讨论】:

    • 所以当我调用 print("Hello World!") 时,内存中存储了“Hello World!”不需要解除分配?
    • @SuperSim135 文字字符串 从不 应该被释放。你应该delete你明确的new,和delete[]你的new[]。如果你有未被new(或new[])分配的内存,你不应该将它传递给delete(或delete[])。
    【解决方案2】:

    在 C++ 中没有什么是自动完成的,因为就像 C 一样,哲学是“不用为不用的东西付费”。一切都必须手动完成。即使您看到内存被自动释放,那也是因为它是在析构函数中完成的(您或库编写者需要手动编写)。对于堆栈上的自动变量,您只需声明它们而不手动分配它们,因此您也不会手动删除它们的内存区域,编译器将处理分配和释放

    但是当您调用print("Hello World!") 时,不需要释放任何东西,因为没有任何东西被分配动态string literal 就像“Hello World!”是const char[N] 类型(当作为参数传递时衰减为const char*)并具有static storage duration,这意味着它们在程序的整个生命周期中都存在于内存中!

    只需要释放动态分配的内存

    【讨论】:

    • C++ 中的任何事情都不会自动完成是一个非常模糊和误导性的陈述。
    • @Skam 堆栈上的内存释放怎么样?超出范围时不会自动释放吗?
    • @Skam 这只是一种哲学,那么它怎么能再详细一点呢? \@SuperSim135 看我的编辑,你没有显式地为自动变量分配内存,所以你没有显式地释放它们