何时将(char *)作为函数参数指向的内存被删除?

时间:2010-12-07 14:44:01

标签: c++ char parameter-passing

代码1:

void foo(char * text) {}

foo("Test");

据我所知,这将会发生:

  • 内存分配给“测试”

  • 指针被创建并且其值被复制到(char *文本指针),因此(char * text)指向内存中的位置,其中“Test”是(更好的说,在第一个char上“测试”)

  • 函数完成后,它会破坏指针(char * text),指向“Test”的开头,不会造成内存泄漏吗?

  • 问题是,“测试”何时被删除,当函数仅销毁指针时

做smth不是更好。像那样? :

char * _text = "Test";
foo(_text);
delete[] _text;

4 个答案:

答案 0 :(得分:3)

您可以将字符串文字视为代码的一部分。它们不是动态分配的,它们具有所谓的“静态存储持续时间”,这意味着它们在程序的持续时间内存在,并且它们不需要被释放(实际上,不能被释放)。

delete[]使用new[]创建的内容总是错误的,因此您的第二个代码段具有未定义的行为。

答案 1 :(得分:2)

“Test”是一个字符串文字,具有静态存储持续时间。在程序运行之前不会删除它。你不应该自己删除它。

答案 2 :(得分:0)

实际上它不会被删除。

该字符串在数据段中分配,对foo("Test")的调用只是将指向该字符串的指针推送到堆栈,而不是像你所说的那样“复制”它。

它不是泄漏的内存,因为字符串是最终二进制文件的一部分,并且它总是在那里,在二进制的一部分中仅用于那种事情(常量等)。

字符串本身(“Test”的字节)放在只读部分的数据段中,而指针(例如char *_test = "Test")则存储在读写部分(堆栈)中或堆,它取决于指针的初始化和使用方式)。您可以修改指针,但不会从数据段中删除字符串。

答案 3 :(得分:0)

C中的硬编码值实际上被编译成二进制文件,因此不会被分配。更准确地说,它们出现在可执行文件的“数据”部分中,并且只要程序执行就会生效。

此外,指针不会被“破坏”。请记住,指针只是内存的地址,可能是任何地方(堆栈/堆)但指针不是对象。