临时的,在语句结束时不会被销毁

Temporary not getting destructed at the end of the statement

本文关键字:语句 结束      更新时间:2023-10-16

是否一直保证这种行为?下面的代码使用临时unique_ptr创建一个char*指针。我认为unique_ptr应该在语句结束时被销毁。令我惊讶的是,char*仍然指向有效内存。

void Fill(char* str, long len)
{
    for(int i = 0; i < len; ++i)
        str[i] = 'a';
}
char* x = std::unique_ptr<char[]>(new char[100]).get();
Fill(x, 100);
std::cout << x << std::endl;

这是调用未定义行为。未定义的行为意味着任何事情都可能发生,包括让它看起来有效。临时的unique_ptr实际上正在被销毁,结果释放了包含100个元素的char数组。您正在对不再分配给您的内存位置进行读写操作。

碰巧的是,x所指向的内存在你使用它的时候还没有被分配或读/写其他东西。但是那个内存已经被临时的unique_ptr释放了,所以你不应该乱动它。

千万不要这样做。如果您想保留数组而不是unique_ptr,请使用release()代替。

由于没有给unique_ptr类型的变量赋值,因此只创建了一个临时变量。在x被初始化之后,在Fill被调用之前,内存就被释放了。

只需这样做:

std::unique_ptr<char[]> x(new char[100]);
Fill(x.get(), 100);

正如其他人所说,你的程序没有崩溃只是运气。

确实,x指向已分配的内存,但该内存在语句结束时已被释放,现在x指向的是非法内存,并且试图使用它会调用未定义的行为。

程序看起来工作,因为内存没有分配给另一个进程。但是不能保证内存不会被分配给另一个进程。

阅读@Eric Lippert的最佳解释:

  • 局部变量的内存可以在其作用域之外访问吗?