[英]C++ functions returning arrays
我是C ++的新手。 我習慣用Java編程。 這個特殊的問題給我帶來了很大的問題,因為C ++在處理數組時並不像Java那樣。 在C ++中,數組只是指針。
但為什么這個代碼:
#include <iostream>
#define SIZE 3
using namespace std;
void printArray(int*, int);
int * getArray();
int ctr = 0;
int main() {
int * array = getArray();
cout << endl << "Verifying 2" << endl;
for (ctr = 0; ctr < SIZE; ctr++)
cout << array[ctr] << endl;
printArray(array, SIZE);
return 0;
}
int * getArray() {
int a[] = {1, 2, 3};
cout << endl << "Verifying 1" << endl;
for (ctr = 0; ctr < SIZE; ctr++)
cout << a[ctr] << endl;
return a;
}
void printArray(int array[], int sizer) {
cout << endl << "Verifying 3" << endl;
int ctr = 0;
for (ctr = 0; ctr < sizer; ctr++) {
cout << array[ctr] << endl;
}
}
打印出驗證2的任意值並驗證3.也許這與數組作為指針實際處理的方式有關。
問題是你不能返回本地數組:
int a[] = {1, 2, 3};
...
return a;
是無效的。 你需要復制a
返回之前到動態內存。 目前,由於a
在自動存儲中分配,因此只要函數返回,就會回收數組的內存,從而使返回的值無效。 Java沒有相同的問題,因為所有對象(包括數組)都在動態存儲中分配。
更好的是,您應該避免使用數組來支持旨在替換它們的C ++類。 在這種情況下,使用std::vector<int>
將是更好的選擇。
因為您的數組是堆棧分配的。 從Java遷移到C ++,您必須非常小心對象的生命周期。 在Java中,所有內容都是堆分配的,並且在沒有對其進行引用時進行垃圾回收。
但是,在這里,您定義了一個堆棧分配的數組a,當您退出函數getArray時會將其銷毀。 這是(很多)原因之一,矢量比普通數組更受歡迎 - 它們為您處理分配和釋放。
#include <vector>
std::vector<int> getArray()
{
std::vector<int> a = {1, 2, 3};
return a;
}
內存中有兩個變量可以去的地方:堆棧和堆。 堆棧包含在方法中創建的局部變量。 堆在其他條件下保存其他變量,如靜態變量。
在GetArray()
中創建a
存儲在堆棧上的局部變量,而a
是指向該位置的指針。 當方法返回指針時,釋放了該堆棧的層(包括指針指向的實際值)。
相反,你需要動態分配數組,然后這些值將在不被清除函數返回時和堆a
會指向他們那里。
int * GetArray() {
int* a = new int[3];
a[0] = 1;
a[1] = 2;
a[2] = 3;
cout << endl << "Verifying 1" << endl;
for (int ctr = 0; ctr < 3; ctr++)
cout << a[ctr] << endl;
return a;
}
現在你將這些int的地址傳遞給函數和從函數傳遞,而值都位於堆中,直到程序結束才會釋放它們,或者(最好) delete
它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.