我正在嘗試實作一個回傳陣列的函式,我來到了這個解決方案,但我不知道這是否是一個好習慣,我就是這樣做的:
#include <iostream>
using namespace std;
int* returnNewArray(int n) {
int* arr = new int[n];
for (int i=0;i<n;i )
arr[i] = i;
return arr;
}
int main() {
int n = 5;
int* arr = returnNewArray(n);
for (int i=0;i<n;i )
cout << arr[i] << "\t";
delete[] arr;
arr = NULL;
cout << endl;
}
我想知道是否有必要釋放我在函式中分配的記憶體來創建動態陣列(arr)。
uj5u.com熱心網友回復:
我不知道這是否是一個好習慣
它不是。如今,需要使用new/new[]和delete/delete[]的情況很少。
我想知道是否有必要釋放我在函式中分配的記憶體
如果您想避免記憶體泄漏,并且由于您使用的是原始擁有指標,則需要手動執行此操作,就像您在代碼中所做的那樣。您的代碼正在正確清理。
然而,好的做法是使用std::vector<int>或至少使用智能指標,std::unique_ptr<int[]>因為它們會在超出范圍時自動清理記憶體。
vector<int>版本:
#include <numeric> // std::iota
#include <vector> // std::vector
std::vector<int> returnNewArray(size_t n) {
std::vector<int> arr(n);
std::iota(arr.begin(), arr.end(), 0); // [0, n)
return arr;
}
unique_ptr<int[]>版本:
#include <memory> // std::unique_ptr / std::make_unique_for_overwrite
#include <numeric> // std::iota
std::unique_ptr<int[]> returnNewArray(size_t n) {
auto arr = std::make_unique_for_overwrite<int[]>(n);
std::iota(arr.get(), arr.get() n, 0); // [0, n)
return arr;
}
這兩個版本都可以讓您像在代碼中一樣迭代結果 - 完成后您無需執行delete[]任何操作:
auto arr = returnNewArray(n);
for(int i = 0; i < n; i)
std::cout << arr[i] << '\t'; // 0 1 2 3 4
但是std::vector<int>它的好處是知道自己的大小,并且可以在基于范圍的 for 回圈中使用,這也有助于避免意外訪問陣列越界:
for (int value : arr) // range based for-loop
std::cout << value << '\t'; // 0 1 2 3 4
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/506465.html
