gpt4 book ai didi

c++ - 为什么 new int() 像 C++ 中的数组一样工作?

转载 作者:行者123 更新时间:2023-12-05 09:02:02 26 4
gpt4 key购买 nike

据我所知

int* p = new int();

有点像用构造函数创建一个 int。如果是这样,为什么下面的代码像数组一样工作?

int* p = new int();

*p = 5;

p[1] = 15;

for (int i = 0; i < 2; i++)
cout << p[i] << endl;
5
15

最佳答案

Why does new int() work like an array in C++?

p[1] 等价于*(p + 1),它只是取消引用指针以访问存储在它指向的内存位置中的值,该表示法类似于数组表示法,它是允许的,并且比指针表示法更受欢迎,因为它更具可读性。


As far as I understand

 int* p = new int();

Is something like creating an int with a constructor.

是的,但这还不是全部,您还在为一个 int 分配内存并将内存地址分配给指针 p

请注意,它可能是 int* p = new int[2],它是完全相同的指针,但在这种情况下,new 返回的内存块是好的对于 2 int 而不仅仅是一个,顺便说一句,这将使您的其余代码有效,除了您不这样做的事实 delete new 分配的内存,这会导致内存泄漏。

现在考虑以下代码:

int arr[10];
int* p = arr;

在这种情况下,您有完全相同的指针,但它将指向具有自动存储持续时间的数组的第一个元素。

指针不知道它指向多少内存,因为它指向给定内存块中的第一个元素,对于程序来说,该 block 有多大并不明显。在索引指针时,程序员有责任不超出该内存。

需要注意的一件重要事情是,在某些情况下,其他语言可能会阻止您涉足其中,而 C++ 不会,它相信程序员会生成正确的代码,这就是为什么通常更难成为 C++程序员。


正如已经指出的,您的程序在 undefined behavior 中产生在访问 p[1] 时。请注意链接资源的第一个短语,它只是说明:

[Undefined behavior] renders the entire program meaningless if certain rules of the language are violated

这里就是这种情况,您正在访问的内存位于手动内存分配定义的范围之外。事实上,输出是你所期望的是(坏,我会说)运气的问题,它可能今天输出正确的结果,明天就崩溃了,谁知道呢。

从上面的例子可以看出,这种情况很难诊断,这3个样本是完全相同的类型。

无论如何,有一些方法可以像这样诊断内存问题,例如 valgrindgcc address sanitizer ,等等。


附带说明,避免使用原始指针,使用 smart pointersC++ containers 之一如果可能的话。

我还鼓励您获得有关 OOP RAII principles 的相关主题的一些知识.

关于c++ - 为什么 new int() 像 C++ 中的数组一样工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72188061/

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