C++ 堆栈内存未被释放

标签 c++ c pointers memory-management

请考虑以下 C++ 代码片段。我将对 char * 的引用作为参数传递给函数。

void name(char **str){
    *str=(char *)"JUSTFORFUN";
}


int main(int argc, const char * argv[])
{
    char *test;
    name(&test);
    cout<<test; //Prints "JUSTFORFUN"
    //delete(test); //Throws error "pointer being freed was not allocated"
    return 0;
}

我认为函数 name() 中用于存储“JUSTFORFUN”的内存是在堆栈上分配的。因此,当控件脱离 name() 时,与 (char *)"JUSTFORFUN"关联的内存应该已被编译器释放。我的问题是为什么当我打印测试时仍然得到正确的输出?它不应该打印一个垃圾值吗?

当我为 int 做类似的事情时。我得到了预期的结果。

void nameint(int **value){
    int val=5;
    *value=&val;
}

int main(int argc, const char * argv[])
{
    int *val;
    nameint(&val);
    cout<<*val; //Prints a junk value 1073828160    
    return 0;
}

为什么 int 和 char * 的行为存在差异?

最佳答案

字符串文字“JUSTFORFUN”存储在堆栈上——它具有静态存储持续时间。尽管只出现在函数 name 内部,但字符串文字本身对于该函数来说并不是本地的(没有字符串文字——它们都有静态存储持续时间)。

因此,第一个程序的行为实际上是明确定义的。 name 返回后,val 包含具有静态存储持续时间的字符串文字的地址,然后您将打印该地址。

在第二个程序中,您将返回函数本地 int 的地址。函数返回后,该 int 不再存在,因此使用它会产生未定义的行为 - 在典型情况下,它可能会打印出当前该地址处的位的任何值,但是有无法保证它会做什么。

关于C++ 堆栈内存未被释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17258022/

相关文章:

c++ - 迭代 boost::icl::interval_set

C编程ftell fseek fread,读取文件大小

c - 如何避免 "null argument where non-null required"编译器警告

c - 尽管使用了 calloc(),为什么我得到的是垃圾值?

C++ 访问二维数组指针处的值

c++ - 向上转换不透明指针

c++ - JNI 是否为 native 代码引入了额外的线程?

c++ - 模板类成员函数的特化

c++ - 创建新指针的方法

c++ - 我怎样才能在 vector 中有一对引用?