gpt4 book ai didi

c++ - 使用动态内存 C++ 移动指针

转载 作者:太空宇宙 更新时间:2023-11-04 13:10:08 24 4
gpt4 key购买 nike

这是我在这个论坛上的第一个问题,抱歉我的英语不好。我对 C++ 中的指针和动态内存有疑问。

例如,这段代码:

#include <iostream>

using namespace std;

int main(int argc, char const *argv[])
{
int *a = new int;

for (int i = 0; i < 5; i++)
cout << a++ << endl;

return 0;
}

输出:

0x11d4c20
0x11d4c24
0x11d4c28
0x11d4c2c
0x11d4c30

我的问题是,为什么我可以移动的不仅仅是我用 new 创建的“单个”内存块。

  • a 指向什么?

new int[] 也会发生同样的情况,即使我指定了大小:

#include <iostream>

using namespace std;

int main(int argc, char const *argv[])
{
int *a = new int[2];

for (int i = 0; i < 5; i++)
cout << a++ << endl;

return 0;
}

输出:

0x2518c20
0x2518c24
0x2518c28
0x2518c2c
0x2518c30

再一次,发生了什么?

  • a 指向什么?

所有这些是否意味着我违反了内存?

最佳答案

aint*,而不是 int。您打印的实际上是指针,即指向对象的内存地址。每当您想修改指向的值时,请使用取消引用运算符 *,即

cout << (*a)++ << endl;

注意:同样,您可以使用引用运算符 & 获取指向 int 的 a 指针,不要与引用混淆(例如 int& 类型)。

可能打印0 1 2 3 4可能 因为您没有初始化在动态内存中创建的新 int。这意味着从 *a 读取(取消引用 a)是未定义的行为,这意味着您的程序可能行为不当。您必须使用 new 更改行:

int *a = new int();

这会将 *a 初始化为 0,现在 0 1 2 3 4 将被正确打印。

请注意 int *a = new int[2]; 确实在动态内存中创建了一个包含 2 个条目的动态数组,这意味着 *(a + 1) 可以也被使用(就好像它是一个常规数组)。它不会*a初始化为2。

请记住在使用完后删除一个;。在实际应用程序中,如果不这样做,您可能会发生内存泄漏 - 即您的程序仍会使用它不再需要的内存。注意,当您必须删除动态分配的数组(即 new int[2])时,您需要使用 delete[] a; 代替,否则您将触发未定义的行为。

您也可以在 C++11 中使用 unique_ptr(或 shared_ptr)作为这种内存分配的替代方案,即:

#include <memory>
// ...
std::unique_ptr<int> a = std::make_unique<int>(0);

多亏了这个解决方案,你不需要delete a因为unique_ptr会在它自己死亡时为你做这件事(即超出范围,在这里) .

编辑:奖励:

0x2518c20
0x2518c24
0x2518c28

如果您只使用 ++,为什么数字会增加 4?

在地址上使用 ++ 实际上会增加 sizeof(T),这里是 sizeof(int) 而不是 1。这解释了为什么如前所述,如果您使用 new int[2],则可以使用 *(a + 1)

关于c++ - 使用动态内存 C++ 移动指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40321992/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com