临时的,在语句结束时不会被销毁
Temporary not getting destructed at the end of the statement
是否一直保证这种行为?下面的代码使用临时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的最佳解释:
- 局部变量的内存可以在其作用域之外访问吗?
相关文章:
- 我的简单if-else语句是如何无法访问的代码
- 有一个打印语句的函数是一种糟糕的编程实践吗
- 为什么在这个代码结束循环中没有得到结束
- 当调用switch语句中的函数时(即使函数不包含循环),似乎是永不结束的循环的问题
- 为什么我的两个 cin 语句没有在程序结束时运行?
- while 循环 C++ 结束,但不继续到其余语句
- 为什么我的 while 语句没有结束?
- switch 语句结束和下一条语句之间的时间是否具有确定性(与路径无关)
- 对于语句结束两次
- 函数永远不会在 switch 语句中结束
- 用return语句结束析构函数安全吗
- C++ if 语句不会结束
- 谁能解释一下递归结束后这些语句是如何执行的
- For 循环结束自身并终止正在运行的程序,但在删除斜率计算语句时正常运行
- 警告 #1011:非 void 函数结束时缺少返回语句
- 在sentinel使用条件语句结束循环后显示最大值
- 临时的,在语句结束时不会被销毁
- 在没有返回语句的情况下到达函数结束
- 当一个返回对象的函数在没有返回语句的情况下结束时会发生什么
- libpqxx 结束准备的语句和结果