按值返回堆栈中的对象

Ram*_*uri 1 c++ memory-leaks

当我有一个非dinamically分配的对象时,我按值返回它:

string get()
{
    string str("hello");
    return str;
}
Run Code Online (Sandbox Code Playgroud)

有机会获得内存泄漏吗?我举了一些例子:

int main(int argc, char** argv)
{
    string str=get(); // case 1
    get();              // case 2
    string* ptr=&get();    // case 3
}
Run Code Online (Sandbox Code Playgroud)

在哪些情况下有内存泄漏?

ssu*_*ube 7

没有内存泄漏,但案例3甚至没有模糊的有效性.

get()函数返回一个字符串的副本,可能是优化的,因为它std::string是一个类而不是指针或其他任何东西.从用户的角度来看,它与int从函数返回函数大致相同:创建并返回副本,并在函数作用域之外保持有效,以便允许赋值或使用.如果没有这种行为,通常就不可能返回值.

它非常类似地应用于POD和类(尽管该类需要复制构造函数等).你应该能够为几乎任何一个std类做到这一点,虽然制作副本的成本会有所不同(std::vector<BigClass>(1000)例如,返回a是一个坏主意).根据设置,您的编译器可能能够通过RVO优化副本.

案例1使用:分配副本str,没有内存泄漏,没有问题.很简单.

案例2丢弃了副本,但仍然没有问题.

情况3将尝试获取临时返回值的地址,该值将被编译器快速销毁(由于未使用)并ptr生成挂起指针.ptr临时消失后的任何使用都将导致未定义的行为,可能是访问冲突.临时销毁的地点和时间取决于您的编译器,设置和其他您不能依赖的东西.

正确的形式是1(虽然2也有效,但不是很有用).