我正在尝试学习C ++,我在C#方面有相当丰富的经验,两种语言是如此不同,并且在理解数据类型和数据类型的指针变体以及它们的初始化方面遇到困难,请考虑以下代码:
wchar_t *array = new wchar_t[10]; //Declaring a pointer of wchart_t and initializing to a wchar_t array of size 10 ?
auto memAddressOfPointer = &array; //auto is resolving memAddressOfPointer to a pointer of a pointer?
cout << array << endl; //Printing the memory address of array not the object created above?
cout << *array << endl; //Getting the actual value of the object (empty wchar_t array of size 10 in bytes?
cout << &array << endl; //Printing the address of the obj?
cout << memAddressOfPointer << endl; //Printing the address of the obj ?
我的问题是为什么我要创建一个指针并对其进行初始化?为什么不只创建wchar_t数组呢?像:
wchar_t array [10];
我也参考此堆栈文章:Unable to create an array of wchar_t
谢谢您的考虑。
[如果您知道需要放入数组的元素数量的大小,则只需使用数组,即wchar_t arr[10];
。
如果不知道大小,则可以在运行时使用动态内存分配以所需的大小(即wchar_t *arr = new wchar_t[required_size]
)创建阵列。分配内存后,需要使用delete[]
运算符(用于数组)和delete
(用于非数组指针)来对其进行分配。但是,我强烈建议您不要这样做,而是选择二者之一
std::wstring
,它将自动为您处理。std::vector
用于其他所有操作。这是一个动态数组,它将自动增长。没有手动内存管理等。unique_ptr
或shared_ptr
。使用智能指针的优势在于,一旦超出范围,它们将自动清除。如果编写程序时知道数组的范围,则wchar_t array [10];
绝对没有错。如果10
是固定(constexpr
)的数字,请坚持使用。
rawwchar_t *array = new wchar_t[10];
允许您做的是让10
是您在运行时发现的数字。您可以将10
更改为x
,并让x
为用户提供的数字或以某种方式计算的数字。另一方面,当wchar_t array [x];
不是x
时的constexpr
是有效的C ++(但在某些实现中可用作扩展,称为VLA)。注意:使用new
的一个缺点是您需要确保delete
相同的指针。这并不总是那么简单。因此,通常不希望使用这些std::unique_ptr<wchar_t[]>
,并且当指针超出范围时资源将为delete[]
d。