指针的一生
Lifetime of the pointers
我正在观看与Herb Sutter一起观看Symbio C 研讨会的视频 - (A)Lifetime 20.6.2016,https://www.youtube.com/watch?v=7b75rchg7z0&t=917s
以下代码已从视频11 :: 24中撰写。示波器熄灭时,必须使P1,P2和P3指针无效。试图解释指针时,它必须给出错误。
我正在在线使用https://wandbox.org/环境。GCC和Clang都给出以下结果。这一定是错误的。
有人可以在Visual Stdio上检查相同的代码。
谢谢
#include <iostream>
using namespace std;
#include <vector>
#include <memory>
#include <cstdio>
#include <cassert>
#include <string>
#include <iterator>
#include <algorithm>
#include <array>
int* p1 = nullptr; int* p2 = nullptr; int* p3 = nullptr;
int main() {
{
int i = 1;
struct MyStruct { char a; int i; char c;} s = {'a', 2, 'c'};
array<int,7> arr = {0,1,2,3,4,5,6};
p1 = &i;
p2 = &s.i;
p3 = & arr[2];
*p1 =*p2= *p3 = 42;
cout << *p1 << *p2 << *p3 << endl;
}
*p1 = 1; // This must give error
*p2 = 2;
*p3 = 3;
cout << *p1 << *p2 << *p3 << endl;
}
这是输出:
424242
123
代码的行为是不确定的。
在第一个cout
语句之后,指针是悬挂。他们指出的变量具有自动存储持续时间,现在不超出范围。
一个C 编译器是不需要发布诊断(在编译时不能总是识别悬挂的指针),尽管如果您设置了适当的标志,则有些人会警告您。您可以将未定义行为的来源减少到
int main()
{
int* p;
{
int n;
p = &n;
}
*p = 0; // oops
}
视觉C 17也无法检测到未定义的行为,并给出相同的输出。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- 调整大小后指向元素值的指针unordered_map有效?
- 正在将指针转换为范围
- 使用指向成员的指针将成员函数作为参数传递
- 将OpenCV C++重写为EmguCV C#-如何使用指针
- 指针的一生