gpt4 book ai didi

c++ - 指向变量的指针与指向一个元素数组或零元素数组的指针相同吗?

转载 作者:行者123 更新时间:2023-11-30 02:32:58 29 4
gpt4 key购买 nike

Array with size 0对零长度数组有很好的解释,当然是有值(value)和中肯的。我没有看到它将零长度与单元素数组和指向变量的指针进行比较。

我之前问的时候(Is c++ delete equivalent to delete[1]?)我没有表达好。我的问题似乎与 new、new[]、delete 和 delete[] 的问题相同或包含在更一般的答案中。有些人理解我只是在问一个单一的元素。评论中的所有答案似乎都是正确且一致的。

有一个问题看起来和这个问题一样。但是正文是关于一起使用 C++ 和 Java 的。在这里,我们只讨论 C++。

检查我的理解

我将提出成对的等效陈述。这些语句是指向单个变量的指针的声明或实例化,后跟指向一个元素数组的指针。然后我将说明为什么我认为它们是等价的或不等价的。

这些对是否等价?

int one = 1;

// Sample 1. Same in the sense of pointing to an address somewhere
// whose contents equal one. Also same in the sense of not being able to
// change to point to a different address:
int * const p_int = &one;
int a_int[1] = {1};

// Sample 2.
int * p_int1 = new int;
int * a_int1 = new int[1];

// Sample 3.
delete p_int1;
delete[] a_int1;

// Sample 4. If Sample 3 is an equivalent pair, then (given Sample 2)
// we can write
delete[] p_int1;
delete a_int1;

诚然,样本 4 是不好的做法。

我在想:“删除”会调用对象的析构函数。 delete[] 会为数组的每个元素调用析构函数,然后为数组调用析构函数。示例 2 中的 new 将 malloc(可以这么说)变量。 new[] 将 malloc 一个元素的数组,然后 malloc 一个元素。然后那个元素将被设置为等于 1。所以,我在想这就是为什么我需要调用 delete[] 而不是 delete 当我有一个甚至只有一个元素的数组时。我明白了吗?

如果我理解,然后调用 delete 而不是 delete[] 来释放一个元素的数组,那么我肯定会发生内存泄漏。内存泄漏是将要发生的特定“坏事”。

但是,这个呢:

int * a_int0 = new int[0];
delete a_int0;

这会导致内存泄漏吗?

我欢迎大家纠正我对术语的误用和其他任何错误。

最佳答案

示例 1:

int const * p_int = &one;
int a_int[1] = {1};

NO,它们不等价。指针与数组不同。由于与 1 相同的原因,它们并不相同与 std::vector<int>{1} 不同:一个元素的范围与一个元素不同。

示例 2:

int * p_int1 = new int;
int * a_int1 = new int[1];

这些是等价的。你必须delete它们不同,但除此之外你会使用 p_int1 的方式和 a_int1是一样的。您可以将两者视为一个范围(分别以 p_int1+1a_int1+1 结尾)。

示例 3:

delete p_int1;
delete[] a_int1;

我认为这些在某种意义上是等价的,因为它们都正确地释放了两个变量各自的内存。

示例 4:

delete[] p_int1;
delete a_int1;

我认为这些是等价的,因为两者都正确地释放了两个变量各自的内存。

关于c++ - 指向变量的指针与指向一个元素数组或零元素数组的指针相同吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35871758/

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