Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 暂时不在语句末尾被破坏_C++_C++11 - Fatal编程技术网

C++ 暂时不在语句末尾被破坏

C++ 暂时不在语句末尾被破坏,c++,c++11,C++,C++11,这种行为一直都有保证吗?下面的代码使用临时唯一\u ptr创建一个char*指针。我认为在语句的末尾应该销毁惟一的_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, 10

这种行为一直都有保证吗?下面的代码使用临时唯一\u ptr创建一个char*指针。我认为在语句的末尾应该销毁惟一的_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;
void Fill(char*str,long len)
{
对于(int i=0;i调用未定义行为的std::cout。未定义的行为意味着任何事情都可能发生,包括让它看起来有效。临时的
unique_ptr
实际上正在被破坏,结果是释放100元素
char
数组。您正在读写一个不再分配给您的内存位置

碰巧的是,
x
所指向的内存在您使用它时还没有被分配或读/写。但是这个内存已经被临时的
unique\u ptr
释放了,所以你不应该弄乱它


不要这样做。如果您想保持数组而不是
唯一\u ptr
,请改用
release()

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

由于内存尚未分配给另一个进程,程序似乎正常工作。但不能保证内存不会分配给另一个进程

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


由于您尚未指定类型为
unique\u ptr
的变量,因此您只创建了一个临时变量。在调用
Fill
之前,只要初始化
x
,就会释放内存

只需这样做:

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

Fill(x.get(), 100);
std::unique_ptr x(新字符[100]);
填充(x.get(),100);

正如其他人所说,你的程序没有崩溃真是幸运。撞车很少有保证。

什么让你认为它是有效的?在我看来是无效的。您在这里有未定义的行为。Undefined意味着它可以以任何方式失败,包括看起来工作,或者临时工作并在很久以后引起问题,或者只在满月时才引起问题。我说的“有效”是指x通过Fill()方法填充数据并打印数据。我明白,这是一个错误的假设。@jagansai:那是无效的。只是未定义。这可能在发布编译中失败。调试编译对滥用内存非常宽容。虚拟地址空间对每个进程都是私有的,永远不能“分配给另一个进程”。风险在于它会在流程中被其他对象重用。