[英]Is this a good use/code of arrays with pointers in C++?
我想問你是否考慮這段代碼,這是完全壞的還是我對內存的使用不好?
這是代碼
// Ask for capacity
int capacity ;
cout << "capacity: ";
cin >> capacity;
// Declare the array with pointers, this line is very important
int *arr = new int;
// For 0 until capacity-1 print ask for the numbers
for (int i = 0; i < capacity; i++)
{
cout << "number: ";
cin >> *(arr + i);
}
// Print them
for (int i = 0; i < capacity; i++)
{
cout << "[" << i << "]: " << *(arr + i) << " in " << arr + i << endl;
}
這是其輸出的一個例子
capacity: 9
number: 1
number: 2
number: 3
number: 4
number: 5
number: 6
number: 7
number: 8
number: 9
[0]: 1 in 0x55dee480c690
[1]: 2 in 0x55dee480c694
[2]: 3 in 0x55dee480c698
[3]: 4 in 0x55dee480c69c
[4]: 5 in 0x55dee480c6a0
[5]: 6 in 0x55dee480c6a4
[6]: 7 in 0x55dee480c6a8
[7]: 8 in 0x55dee480c6ac
[8]: 9 in 0x55dee480c6b0
看起來,有效地將數字保存在內存中的正確位置(4位,整數的大小),但是極限是什么? 我怎么知道我是否在碰我不該碰的記憶? 因為看起來我將數組聲明為
int * arr =新的int
這樣可以嗎?
與此代碼相同,但可能會更糟一些,因為它是字符串,如您所知,字符數組
// Declaring the pointer name as new char and ask for it
char *name = new char;
cout << "name in: ";
cin >> name;
cout << "name out\n";
for (int i = 0; *(name + i) != '\0' ; i++)
{
printf("[%i]: %c\n", i, *(name + i));
}
例:
name in: Gilberto
name out
[0]: G
[1]: i
[2]: l
[3]: b
[4]: e
[5]: r
[6]: t
[7]: o
該代碼僅分配一個int
對象。 固定:
int* arr = new int[capacity];
*(arr + i)
可以更簡單: arr[i]
。
代碼需要在最后刪除數組:
delete[] arr;
或者,更好的是,使用智能指針來避免手動刪除:
std::unique_ptr<int[]> arr(new int[capacity]);
或者,甚至更好地使用std::vector<int> arr(capacity);
。
在現代C ++中,原始(擁有)指針和手動內存管理從來都不是一個好主意。 您應該每天使用諸如std::array
和std::vector
類的容器,而不是C樣式的數組。 和所有權和動態資源的壽命更好的智能指針像為藍本std::unique_ptr
, std::shared_ptr
& std::weak_ptr
,而不是原始指針。 不要編寫容易出錯的代碼。 使用我們提供的設施,寫代碼,很容易得到正確的和硬 (ER),以獲得錯誤的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.