【发布时间】: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
当我将const char* 作为函数参数传递时(像这样):
void print(const char* text)
{
std::cout << text << std::endl;
}
会自动删除吗?如果没有,它会发生什么,我应该如何删除它?
【问题讨论】:
标签: c++ pointers memory-management string-literals const-char
指针变量是指向其他内存的变量。
当您将指针作为参数传递给函数时,会复制指针本身,但不会复制它指向的内存。因此没有什么可以“删除”的。
让我们来看这个简单的示例程序:
#include <iostream>
void print(const char* text)
{
std::cout << text << std::endl;
}
int main()
{
const char* text = "foobar";
print(text);
}
当main 函数运行时,您会看到如下内容:
那么当print 函数被调用并运行时,它就有了自己的指针副本:
两个变量指向同一个内存。
此外,像上面示例中的 "foobar" 这样的文字字符串将永远需要被删除或释放,它们由编译器管理并存在于程序的整个运行时.
【讨论】:
delete你明确的new,和delete[]你的new[]。如果你有未被new(或new[])分配的内存,你不应该将它传递给delete(或delete[])。
在 C++ 中没有什么是自动完成的,因为就像 C 一样,哲学是“不用为不用的东西付费”。一切都必须手动完成。即使您看到内存被自动释放,那也是因为它是在析构函数中完成的(您或库编写者需要手动编写)。对于堆栈上的自动变量,您只需声明它们而不手动分配它们,因此您也不会手动删除它们的内存区域,编译器将处理分配和释放
但是当您调用print("Hello World!") 时,不需要释放任何东西,因为没有任何东西被分配动态。 string literal 就像“Hello World!”是const char[N] 类型(当作为参数传递时衰减为const char*)并具有static storage duration,这意味着它们在程序的整个生命周期中都存在于内存中!
只需要释放动态分配的内存
【讨论】: