C ++与"pointer = new type []"相比,"pointer = new type"是什么?
c++ what is "pointer = new type" as opposed to "pointer = new type []"?
在许多教程中,关于动态内存的第一个代码示例的开头如下:
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;
- "Called Object Type is Not a Function or Pointer" 与 typedef 和类
- 这是什么意思:"member reference type 'Human *' is a pointer; did you mean to use '->'?"
- C++ 中数组的"expression must have pointer-to-object type"是什么?
- 海湾合作委员会 7、aligned_storage 和 "dereferencing type-punned pointer will break strict-aliasing rules"
- "base operand of ‘->’ has non-pointer type" 但它是指针
- 当您声明"pointer type"形式(函数)参数"like an const array"时,什么是常量?
- 使用 "this" 关键字时的"Error: expression must have a pointer type"
- 在 2D 阵列分配期间对 calloc 进行"expression must have (pointer-to) function type"
- 禁用 Clang 中的"cast from pointer to smaller type uint32_t"错误
- 收到"void* is not a pointer-to-object type"错误,但使用 XCode 时代码完美执行
- 在C++,我收到一条消息"error: 'void*' is not a pointer-to-object type"
- 这个错误是什么意思" expression must have pointer-to-class type"?
- 海湾合作委员会警告"dereferencing type-punned pointer will break strict-aliasing rules"
- "Expression must be a pointer to a complete object type"
- 使用 -> 时提供对象"must be a pointer-to-class type",使用 - 时提供"must be a class type"对象
- "'void*' is not a pointer-to-object type"没有空白*的代码?
- const-pointer-to-type, pointer-to-const以及讨论const的术语
- gcc:如何正确使用__attribute((__may_alias__))以避免"derefencing type-punned pointer"警告
- "error: request for member ‘size’ in ‘a’, which is of pointer type"但我不认为这是一个指针
- C ++与"pointer = new type []"相比,"pointer = new type"是什么?