C++ 数组和内存位置

标签 c++ arrays

我有一段处理 C++ 数组的代码。

 using namespace std;
 #include <iostream>

 int main(){
 int *p;
 p = new int[3];
 for(int i = 0; i < 3; i++){
    p[i] = i;
 }
 //delete[] p;
 for(int i = 0;i <3; i++){
    std::cout << *(p+i) << std::endl;
 }
}

这段代码是如何工作的?内存位置 *(p+i) 是如何工作的?它与使用 p[i] 有什么不同。如果我们取消注释行delete[] p.

,代码会有什么不同

最佳答案

1)当你这样做时:

p = new int[3];

现在,p指向动态分配数组的第一个元素。

当你这样做时,*(p + i)将导致简单的指针算术。它将归结为:value of (<address pointed by p> + <size of type pointed by p> * i ) 相当于 p[i] .

这就是它起作用的原因。

2) 在 C++ 中,与 java 不同,您必须使用 delete 显式清除动态分配的内存。 ,因为 C++ 中没有 GC(根据 Bjarne Stroustrup 的说法,永远不会有)。否则,该内存区域将在应用程序生命周期内保持获取状态,从而导致内存泄漏。

建议:

放置您的 delete在程序的最后。否则,下面的循环可能会给出 SIGSEGV。

此外,避免使用 newdelete尽可能多。

关于C++ 数组和内存位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54299563/

相关文章:

c++ - 使用 "cout"在 Windows 对话框中显示消息 - C++

c++ - 带有 GCC 的 C++11 中的线程作用域对象

javascript - 如何在 javascript 中镜像多维数组?

c - 函数的输出值与循环中的 printf 值不匹配

javascript - 根据相应的类将值迭代到不同的元素中

c++ - 普通的C++代码在一个测试项目中通过,而在主要项目中则失败

c++ - 为什么跨两个 block 的共享内存的指针位置相同?

c++ - 如何避免重复使用socket?

arrays - 如何制作一个可以让我制作元素并将它们添加到数组的函数?

java - 二维数组的排列