2009-07-10 71 views
0

所以,我有這個數組。它需要在此功能範圍之外訪問。我一直在把一個指向它的指針變成一對,這個指針變成了一個deque。但是一旦我超出範圍,本地堆棧消失,數組無效,並且我剛剛得到一個無用的指針,對吧?範圍,數組和堆

所以我試圖把這個數組放到超範圍的堆上,它會一直存在,直到我稍後再刪除它。但我有問題得到這個工作。現在g ++正在咳嗽關於無效轉換從'int'到'int *'的錯誤。

void randomFunction(int x, int y, int width, int height) 
{ 
    int **blah[4] = {x, y, width, height}; 
    std::pair <foobar*, int* > tempPair (foobar1, blah); 
    randomDeque.push_front(tempPair); 
} 

我也試過初始化這樣的:

int *blah[4] = new int[4]; 

...它說,該陣列必須以括號內的初始化進行初始化。

我真的不習慣使用指針。我究竟做錯了什麼?

回答

1

整個概念對我來說很陌生。如果你在棧上聲明數組,它不會超出函數的範圍。如果你使用'新'分配它 - 確保你'刪除'它,否則它是內存泄漏! 正確的代碼,「新」是:

int *blah = new int[4]; 
... 
// don't forget to: 
delete [] blah; 
0

它看起來像你想有一個4x4的陣列,在這種情況下,你應該像這樣創建它(未經測試的代碼從我的頭頂):

int **blah = new int* [4]; 
for(int i = 0; i < 4; ++i) 
{ 
    *blah[i] = new int[4]; 
} 

或者,你可以創建一維數組,並把它當作一個二維數組:

int *blah = new int[16]; 
#define ELEM(x,y) w*4+h 
blah[ELEM(1,1)] = 123; 
+0

您突出顯示代碼,然後按ctrl-k或*代碼示例*按鈕進行格式化。 – 2009-07-10 06:49:25

2

有兩個問題。首先,確實,你都搞不清指針/數組:

int a[4]; // this is an array of 4 integers, a is the name of the array 
int *a[4]; // This is an array of 4 *pointers* to int 

所以你的宣言:

int **blah[4]; 

定義的4個指針數組的指針數組。也許你對以下事實感到困惑(我知道當我學習C時)。如果您聲明一個變量:

int *a; 

這是一個指向整數的聲明。但是,如果你有一個變量是一個指針,你用得到它指向(此處整數)的東西* A:

*a = 1; // a is a pointer (i.e. an address), *a is the value pointed to by a. 

所以*在聲明來聲明指針,但*陳述用於推定價值。

但是你的第二個問題與指針本身無關。這是關於資源管理(內存是一個,但文件,鎖是其他)。超出範圍時,堆棧上分配的任何東西不再存在。在純粹的C語言中,你只有一個解決方案:在malloc上分配堆,然後確保釋放。所以,你會做這樣的事情:

​​

然後,你將與其他功能清潔:

foo *a; 
a = init_foo(); 
// do stuff 
clean_foo(a); 

例:FILE *手柄的fopen/FCLOSE(除分配的東西,有是一些與操作系統相關的東西來處理文件)。另一種解決方案是使用alloca,它不是標準的C,但是被許多工具鏈支持。

在C++中,您可以使用智能指針,例如使用引用計數來執行資源管理。我對C++不太熟悉,我相信人們會參與這一部分。引用計數的思想是它仍然具有自動指針的一些優點(您不必自己調用delete,這對於非平凡的項目來說極其容易出錯),但不是純粹基於範圍的。一個引用基於計數的智能指針是boost中的shared_ptr。

1

我不知道我是否正確地做了你想做的事情,但是如果你想要返回一個int數組的引用,這將在randomFunction返回後有效,一個好方法是使用Boost:

#include <boost/shared_ptr.hpp> 
#include <vector> 

boost::shared_ptr<std::vector<int> > randomFunction(int x, int y, int width, int height) 
{ 
    boost::shared_ptr<std::vector<int> > blahPtr(new std::vector<int>(4)); 
    (*blahPtr)[0] = x; 
    (*blahPtr)[1] = y; 
    (*blahPtr)[2] = width; 
    (*blahPtr)[3] = height; 
    return blahPtr; 
} 

你不必記住delete荷蘭國際集團blahPtr - 當所有副本走出去的範圍,加速將自動刪除您的std::vector對象和C++標準庫將刪除底層數組。