返回堆栈变量?

Erh*_*nis 9 c++ variables heap stack pointers

所以,我总是对C++指针有点模糊,而不管其他人被调用了什么.喜欢,

Object* pointer = new Object();
Run Code Online (Sandbox Code Playgroud)

Object notpointer();
Run Code Online (Sandbox Code Playgroud)

我知道指针可能涉及第二个,但基本上它是一个非指针.(它究竟叫什么?)

此外,我相信,对于第一个,你必须打电话

delete pointer;
Run Code Online (Sandbox Code Playgroud)

一旦你完成它,在某些时候,对吧?而另一个你不需要担心.我已经读过,第一个是在堆上分配的,但是第二个是在堆栈上分配的,并在方法返回时消失.

但是,当你从函数返回一些东西(不是原始的)时呢?

写一个很好的例子我应该返回std :: strings吗?:

std::string linux_settings_provider::get_home_folder() {
    return std::string(getenv("HOME"));
}
Run Code Online (Sandbox Code Playgroud)

通过我之前写的,字符串在堆栈上分配,并且应该在函数返回时释放,对吧?然而没有人对此有任何说法,所以我认为它运作正常.为什么?

一般来说,有什么区别

return new std::string("pointer");
Run Code Online (Sandbox Code Playgroud)

return std::string("not-pointer");
Run Code Online (Sandbox Code Playgroud)

另外,假设两者兼顾,两者的利弊是什么?

das*_*ght 11

当您通过指针返回时,您需要以您显示的方式返回动态分配的对象(即,如果稍后取消引用,则返回指向堆栈对象的指针会导致未定义的行为).这会产生内存泄漏的可能性,因为正如您所指出的那样,需要明确删除该对象.

另一方面,按值返回(即第二个片段)会导致复制从返回到接收返回值的对象的堆栈对象返回的对象:

std::string res = get_home_folder(); // std::string gets copied into res
Run Code Online (Sandbox Code Playgroud)

编译器可以优化它以避免通过返回值优化进行复制.