簡體   English   中英

這是C ++中帶指針的數組的良好用法/代碼嗎?

[英]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::arraystd::vector類的容器,而不是C樣式的數組。 和所有權和動態資源的壽命更好的智能指針像為藍本std::unique_ptrstd::shared_ptrstd::weak_ptr ,而不是原始指針。 不要編寫容易出錯的代碼。 使用我們提供的設施,寫代碼,很容易得到正確的 (ER),以獲得錯誤的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM