C++ 什么决定在返回时取消分配本地分配?

C++ 什么决定在返回时取消分配本地分配?,c++,variables,memory-management,scope,C++,Variables,Memory Management,Scope,我有两段代码,一段有效,一段无效。第一部分只是一个测试,以确定从本地分配返回的字符指针是否仍然有效。出于某种原因,这是可行的: char* test(){ char* rawr="what"; return rawr; } 但这个不起作用: char* folderfromfile(char* filz) //gets the folder path from the file path { //dec

我有两段代码,一段有效,一段无效。第一部分只是一个测试,以确定从本地分配返回的字符指针是否仍然有效。出于某种原因,这是可行的:

    char* test(){
        char* rawr="what";
        return rawr;  
    }
但这个不起作用:

    char* folderfromfile(char* filz) //gets the folder path from the file path
    {
            //declarations
            int  lastslash=-1;
            int  i        =0;
            char rett[256];

        for(i;(int)filz[i]!=0;i++)
                if(filz[i]=='\\')
                    lastslash=i;     //records the last known backslash

        if(lastslash==-1)
                return "";           //didn't find a backslash

        for(i=0;i<=lastslash;i++)
                rett[i]=filz[i];     // copies to new string

        rett[i]    =0; //end of string
        cout << &rett << "====" << rett << endl;

        system("pause>nul");//pause so i can watch over the memory before it deallocates
        return rett;  
    }
char*folderfromfile(char*filz)//从文件路径获取文件夹路径
{
//声明
int lastsslash=-1;
int i=0;
charrett[256];
对于(i;(int)filz[i]!=0;i++)
如果(filz[i]='\\')
lastslash=i;//记录最后一个已知的反斜杠
如果(lastslash==-1)
return“”;//未找到反斜杠

for(i=0;irett在堆栈上分配,因此当方法返回时,它的内存空间不再有效

rawr指向一个文本,当程序运行时,编译器可能会在(只读)内存中保留该文本

这两种方法都是错误的


您需要使用new(或C中的malloc)或std::string来分配缓冲区。

rett是在堆栈上分配的,因此当方法返回时,它的内存空间不再有效

char* test(){
    char* rawr="what";
    return rawr;  
}
rawr指向一个文本,当程序运行时,编译器可能会在(只读)内存中保留该文本

这两种方法都是错误的

您需要使用new(或C中的malloc)或std::string来分配缓冲区

char* test(){
    char* rawr="what";
    return rawr;  
}
字符串literal
“what”
没有分配到堆栈上-它在程序的整个生命周期内保持有效。但是,它不能被修改。指针
rawr
本身就在堆栈上,但这只是在编写类似
&rawr
的东西,获取指向指针时的问题

char* folderfromfile(char* filz){ //gets the folder path from the file path
    int lastslash=-1,i=0;char rett[256]; //declarations
    ///// ...
    return rett;  
}
但是,这会在堆栈上放置一个数组。
rett
这里是隐式的
&rett[0]
,即获取指向数组的第一个元素的指针,该元素非常位于堆栈上,返回后无效

字符串literal
“what”
没有分配到堆栈上-它在程序的整个生命周期内保持有效。但是,它不能被修改。指针
rawr
本身就在堆栈上,但这只是在编写类似
&rawr
的东西,获取指向指针时的问题

char* folderfromfile(char* filz){ //gets the folder path from the file path
    int lastslash=-1,i=0;char rett[256]; //declarations
    ///// ...
    return rett;  
}

但是,这会在堆栈上放置一个数组。
rett
这里是隐式的
&rett[0]
,即获取指向数组的第一个元素的指针,该元素非常位于堆栈上,返回后无效。

第一个元素恰好起作用,因为
什么
恰好位于编译器的堆栈之外。使用非常量字符串,或者仅仅更改编译器、体系结构或编译器标志,都可能会改变这一点。甚至不要考虑编写这样的中断代码。在一个不相关的注释中,您真的应该每行编写一条语句。这不仅可以大大提高可读性,而且还可以因此,这将使调试变得更容易,尤其是在遇到断点时。这是我见过的最难看的代码之一。空白是你的朋友。如果代码易于阅读,人们会更愿意帮助你。第一个代码恰好起作用,因为
“什么”
恰好位于编译器的堆栈之外。使用非常量字符串,或者仅仅更改编译器、体系结构或编译器标志,都可能会改变这一点。甚至不要考虑编写这样的中断代码。在一个不相关的注释中,您真的应该每行编写一条语句。这不仅可以大大提高可读性,而且还可以因此,这将使调试变得更容易,尤其是在遇到断点时。这是我见过的最难看的代码之一。空白是你的朋友。如果代码易于阅读,人们会更愿意帮助你。