【发布时间】:2015-06-08 22:50:32
【问题描述】:
这是我正在做的事情的代码:
#include <iostream>
#include <vector>
#include <memory>
using namespace std;
int main()
{
vector<int> ar = {1};
shared_ptr<int> sp(&ar[0]);
cout<<*sp<<endl; // ---- [1]
ar[0] = 10;
cout<<*sp<<endl; // ---- [2]
ar.clear();
cout<<*sp<<endl; // ---- [3]
return 0;
}
输出将是:
1
10
10
而不是cout [3] 我认为,运行时应该有任何错误,因为要访问的对象已经被删除。它是如何在[3] 中打印10 的?或者我应该使用任何g++ 标志,我只是使用g++ -std=c++14 a1.cpp && ./a.out
编辑:在Coliru 上运行时,我发现clang++ 正在给予
`*** glibc detected *** ./a.out: double free or corruption (fasttop): 0x0000000002138010 ***`
但是g++ 不是Coliru。
【问题讨论】:
-
到达
main末尾时不会崩溃吗? -
@DavidRodriguez-dribeas 甚至没有崩溃,就像什么都没发生一样退出!
-
清除向量并不一定意味着它分配的内存正在被删除。
-
这是未定义的行为,未定义的行为是未定义的。它可能会崩溃,也可能不会。你所做的只是访问你不应该访问的内存,它不应该这样做,但它不一定是致命的。
-
人们从哪里得到这样的想法,即编写糟糕的 C++ 代码意味着你肯定会崩溃?