Ove*_*sed 2 c++ arrays pointers dereference
据我所理解
int* p = new int();
Run Code Online (Sandbox Code Playgroud)
就像用构造函数创建 int 一样。如果是这样,为什么下面的代码像数组一样工作?
int* p = new int();
*p = 5;
p[1] = 15;
for (int i = 0; i < 2; i++)
cout << p[i] << endl;
Run Code Online (Sandbox Code Playgroud)
5
15
Run Code Online (Sandbox Code Playgroud)
为什么 new int() 在 C++ 中像数组一样工作?
p[1]相当于*(p + 1),它只是取消引用指针以访问存储在其指向的内存位置中的值,该表示法类似于数组表示法,它是允许的,并且优于指针表示法,因为它更具可读性。
据我所理解
Run Code Online (Sandbox Code Playgroud)int* p = new int();类似于
int用构造函数创建一个。
是的,但这还不是全部,您还为恰好一个分配内存int并将内存地址分配给指针p。
请注意,它可能是int* p = new int[2],它是完全相同的指针,但在这种情况下,返回的内存块适合new2int而不仅仅是 1,顺便说一句,这将使您的代码的其余部分有效,除了您不这样做的事实delete分配的内存new,这会导致内存泄漏。
现在考虑以下代码:
int arr[10];
int* p = arr;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您有完全相同的指针,但它将指向具有自动存储持续时间的数组的第一个元素。
指针不知道它指向多少内存,因为它指向给定内存块中的第一个元素,对于程序来说,该块有多大是不明显的。当索引指针时,程序员有责任不超出该内存。
需要注意的一件重要事情是,在某些情况下,其他语言可能会阻止你涉足其中,但 C++ 不会,它相信程序员能够生成正确的代码,这就是为什么成为一名 C++ 程序员通常更困难。
正如已经指出的,您的程序在访问p[1]. 请注意链接资源的第一句话,它只是说明:
[未定义行为]如果违反语言的某些规则,则整个程序变得毫无意义
就是这种情况,您正在访问的内存位于手动内存分配定义的范围之外。事实上,输出是你所期望的,这是一个运气问题(我想说的是,运气不好),它可能今天输出正确的结果,明天就崩溃,谁知道呢。
从上面的例子可以看出,这种情况很难诊断,这与 3 个示例案例的类型完全相同。
无论如何,都有一些方法可以诊断这样的内存问题,例如valgrind和gcc address sanitizer等。
顺便说一句,避免使用原始指针,使用智能指针或C++ 容器之一。
我还鼓励您获取一些有关OOP RAII 原则相关主题的知识。