临时不会在声明结束时被破坏

Jag*_*ath 4 c++ c++11

这种行为是否始终得到保证?下面的代码使用临时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;
Run Code Online (Sandbox Code Playgroud)

In *_*ico 11

那就是调用未定义的行为.未定义的行为意味着任何事情都可能发生,包括让它看起来有效.临时unique_ptr实际上是被破坏的,因此解除分配100个元素的char数组.您正在读取并写入不再分配给您的内存位置.

x事实上,当你使用它时,指向的内存还没有被分配或读/写.但是那个记忆已经被临时释放了unique_ptr,所以你不应该把它弄得乱七八糟.

只是不要这样做.如果你想保留数组而不是数组unique_ptr,请release()改用.

  • 我会说它看起来*工作,而不是工作. (2认同)