C ++与"pointer = new type []"相比,"pointer = new type"是什么?

c++ what is "pointer = new type" as opposed to "pointer = new type []"?

本文关键字:type pointer new 是什么 相比      更新时间:2023-10-16

在许多教程中,关于动态内存的第一个代码示例的开头如下:

int * pointer;
pointer = new int;        // version 1
//OR
pointer = new int [20];    // version 2

他们总是继续解释第二个版本是如何工作的,但完全避免谈论第一个版本。

我想知道的是,pointer = new int创造了什么?我能用它做什么?什么意思?每个教程都将完全避免谈论第一个版本。我发现(通过搞砸)是这样的:

#include <iostream>
using namespace std;
int main()
{
    int * pointer;
    pointer = new int;
   pointer[2] = 1932;   // pointer [2] exists? and i can  assign to it?!
   cout << pointer[2] << endl;      // ... and access it successfully?!
};

到目前为止,我可以下标pointer这一事实告诉我,pointer = new int隐式创建一个数组。但如果是这样,那么它的大小是多少?

如果有人能帮我澄清这一切,我将不胜感激......

我的老师是这样解释的。
想想电影。实际座位是内存分配,您获得的票证是指针。

int * pointer = new int;

这将是一个只有一个座位的电影院,指针将是该座位的门票

pointer = new int [20] 

这将是一个有20个座位的电影院,指针将是第一个座位的门票。 指针[1]是第二个座位的票,指针[19]是最后一个座位的票。

当你int* pointer = new int;然后进入pointer[2]时,你就让某人坐在过道上,这意味着不确定的行为。

这是

初学者在 C 和 C++ 中的典型错误。第一句话,创造了一个只容纳int的空间。第二个创造了一个容纳20个int的空间。但是,在这两种情况下,它都将动态保留区域开头的地址分配给pointer变量。

为了增加混乱,您可以访问带有索引的指针(正如您放置pointer[2]一样),即使它们指向的内存无效。在以下情况下:

int* pointer = new int;

您可以访问pointer[2],但您将具有未定义的行为。请注意,您必须检查这些访问实际上是否发生,并且编译器在防止此类错误方面通常几乎无能为力。

这将只创建一个整数。

pointer = new int;        // version 1

这将创建 20 个整数。

pointer = new int [20]    // version 2

下面的是无效的,因为指针[2]翻译为*(指针+ 2);它不是被创建/分配的。

int main()
{
    int * pointer;
    pointer = new int;
   pointer[2] = 1932;   // pointer [2] exists? and i can  assign to it?!
   cout << pointer[2] << endl;      // ... and access it succesfuly?!
};

干杯!

> new int[20]为大小为 20 的整数数组分配内存,并返回指向该数组的指针。

new int只是为一个整数分配内存,并返回指向它的指针。隐含地,这与new int[1]相同。

您可以在两个指针上取消引用(即使用 *p),但您应该只在new int[20]返回的指针上使用p[i]

p[0]仍然可以同时处理这两种方法,但您可能会搞砸并意外放置错误的索引。

更新:另一个区别是必须对数组使用 delete[],对整数使用 delete

pointer = new int

堆上分配足够的内存来存储一个int

pointer = new int [20]分配内存以存储 20 int 秒。

这两个调用都返回指向新分配的内存的指针。

注意:不要依赖正在初始化的分配内存,它可能包含随机值。

pointer = new int;分配一个整数并将其地址存储在pointer中。 pointer[2]pointer + 2的同义词。要理解它,请阅读指针算法。这一行实际上是未定义的行为,因为您正在访问以前未分配的内存,并且它之所以有效,是因为您很幸运。

int* p = new int

一个整数分配内存。它不会隐式创建数组。使用 p[2] 访问指针的方式将导致写入无效内存位置时出现未定义的行为。仅当使用new[]语法时,才能创建数组。在这种情况下,您需要使用 delete[] .如果您使用new分配了内存,则意味着您正在创建单个对象,并且需要使用delete释放内存。

*"我可以下标指针的事实告诉我,到目前为止,我pointer = new int隐式创建一个数组。但如果是这样,那么它的大小是多少?*

这是我最喜欢的问题,也是你强调的部分。

众所周知,动态内存分配利用了堆栈上特定于给定程序的空间。当我们仔细研究新运算符的定义时:-

void* operator new[] (std::size_t size) throw (std::bad_alloc);

这实际上表示该特定大小的对象数组,如果成功,则它会自动构造数组中的每个对象。因此,我们可以自由地使用大小范围内的对象,因为它已经被初始化/构造了。

int * pointer = new int;

另一方面,对于上面的例子,

当任何
*(pointer + k) or *(k + pointer)

被使用。尽管可以使用指针访问特定的内存位置,但不能保证,因为未创建或构造相同的特定对象。这可以被认为是一个空间,它没有在堆栈上为特定程序分配。

希望这有帮助。

它不创建数组。它创建一个整数并返回指向该整数的指针。当你写指针[2]时,你指的是一个你没有分配的内存。你需要小心,不要这样做。该内存可以从外部程序进行编辑,我相信,您不想要。

int * pointer; pointer = new int;  // version 1
//OR 
pointer = new int [20]             // version 2 

我想知道的是,pointer = new int创造了什么?我能用它做什么?这意味着什么?每个教程都将完全避免谈论第一个版本

本教程没有告诉你如何处理它的原因是它真的完全没用!它分配一个int,并为您提供指向该的指针。

问题是,如果你想要一个int,为什么不直接声明一个呢?

int i;
相关文章: