请接下来解释一下。
#include <iostream>
#include <set>
int main() {
std::set<int>* a = new std::set<int>;
a->insert(2);
a->insert(5);
for ( std::set<int>::iterator it = a->begin(); it != a->end(); it++ ) {
std::cout << *it << std::endl;
}
std::cout << "Deleting a....." << std::endl;
delete a;
for ( std::set<int>::iterator it = a->begin(); it != a->end(); it++ ) {
std::cout << *it << std::endl;
}
return 0;
}
$ g++ test6.cpp && a
2
5
Deleting a.....
2
5
3544585
答案 0 :(得分:2)
观看2013年Going Native的Stroudstrup演讲中的this part
1)不,你可以创建一个局部变量a
并让它在函数结束时通过正常的控制流释放
std::set<int> a;
a.insert(2);
a.insert(5);
2)你很幸运。它是访问已释放内存的未定义行为。通过valgrind
运行此代码,您将看到错误。
int *ip = new int{1};
delete ip;
int a = *ip; // NOT SAFE, maybe 1, maybe 24630751, maybe crash
答案 1 :(得分:1)
不,标准库包含内存管理功能,因此程序员不必关心它。
您仍然在delete
之后看到合理值输出的原因是因为您的PC尚未在内存空间上写入新值。这就是为什么在删除内存之后尝试访问内存的原因是&#34;未定义的行为&#34;伞。