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

时间:2011-09-01 04:44:42

标签: 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;

3 个答案:

答案 0 :(得分:11)

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

恰好,当你使用它时,x所指向的内存还没有被分配或读/写。但是那个记忆已经被临时的unique_ptr释放了,所以你不应该把它搞得一团糟。

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

答案 1 :(得分:1)

确实x指向已分配的内存,但该内存已在语句末尾释放,现在x指向的是非法内存,并尝试使用它调用未定义的行为。

程序出现,因为内存尚未分配给其他进程。但是不能保证内存不会被分配给另一个进程。

请阅读@Eric Lippert的最佳解释:

答案 2 :(得分:1)

由于您尚未分配unique_ptr类型的变量,因此您只创建了一个临时变量。一旦x被初始化,在调用Fill之前,内存就会被释放。

只需这样做:

std::unique_ptr<char[]> x(new char[100]);

Fill(x.get(), 100);

正如其他人所说,只是运气,你的程序没有崩溃。崩溃很少得到保证。