2016-07-15 49 views
1

如何使用new運算符編寫以下代碼? 請詳細解釋。 在此先感謝。將malloc轉換爲新的

#include<alloc> 
#define MAXROW 3 
#define MAXCOL 5 
using namespace std; 

int main() 
{ 
    int (*p)[MAXCOL]; 
    p = (int(*)[MAXCOL])malloc(MAXROW*sizeof(*p)); 
} 
+0

請注意''不是標準標題。對於'malloc',使用''。 – chris

回答

2

很簡單,回答字面上的問題:

p = new int[MAXROW][MAXCOL]; 

此分配的自由存儲區和一個二維數組(由MAXCOL MaxRow的),像往常一樣new,返回int(*)[MAXCOL] - 與衰減2D陣列相同的類型。別忘了delete[] p;

最後一部分提出了std::vector的重要性。據推測,你在編譯時知道第二維的大小。因此,std::vector<std::array<int, MAXCOL>>將與不需要delete[]聲明的額外獎勵一起使用,並知道其大小(MAXROW)。如果可能的話請使用這個。

事實上,在你的例子中,兩個維度在編譯時已知,這意味着std::array<std::array<int, MAXCOL>, MAXROW>也可以在這裏工作。這通常比動態分配更可取。

如果在編譯時都不知道維度,那麼當您知道每個內部向量的大小相同時,您最好的選擇通常是向量或專用矩陣類的向量來提高性能。

1

字面問題

如何編寫使用new運算符下面的代碼?

&hellip;意味着別的東西比你認爲的意思。

new操作者是一個簡單分配的功能大致直接類似於C中的malloc,除C++ new操作者是可更換的由用戶定義的一個。

您可能的意思是new表達式。這樣的表達式調用new運算符進行分配,然後然後調用構造函數進行初始化,如果分配的東西是類類型的話。它是安全的。

儘管如此,對於你的陣列,你也不想那麼做,只是從標準庫中只需要std::vector


下面是使用向量的std::vector創建一個矩陣的例子:

#include <vector> 
using namespace std; 

auto main() 
    -> int 
{ 
    int const n_rows = 3; 
    int const n_cols = 5; 

    using Row = vector<int>; 

    vector<Row> v(n_rows, Row(n_cols)); 

    // E.g. v[1] is a row, and v[1][2] is an int item in that row. 
} 

即使你不經常使用的矩陣,它可以是包裹是一個好主意矩陣的一般概念,在一個類中。一種簡單的方法是使用單個std::vector進行存儲,並提供例如一個at函數或一個operator()從客戶端代碼索引。如果您還不想自己做這個,那麼例如Boost庫提供了一個矩陣類。

+0

通常,我避免使用像對象一樣的N-dim數組的嵌套向量。有多個indirections訪問一個元素會減慢速度。 – doug

+0

@doug:我同意。這就是爲什麼我建議使用單個矢量作爲矩陣存儲。簡單的聲明是嵌套的原因。 (順便說一下,我發現沒有人對明顯的錯字發表評論,這真是太神奇了:)修正:) :) –

+0

有一種非常簡單的方法來使用單個向量,並仍然使用數組中的2D語義。 (http://stackoverflow.com/questions/36123452/statically-declared-2-d-array-c-as-data-member-of-a-class/36123944#36123944) – doug

1

由於這是C++,我會建議更換使用std::array和使用malloc時,你應該使用free未頁頭或釋放內存,如果使用new你需要使用deletestd::unique_ptr 也;如果你new[]你需要使用delete[]

#include <cstdlib> 
#include <memory> 
#include <array> 
#define MAXROW 3 
#define MAXCOL 5 
using namespace std; 

int main() 
{ 
    int (*p)[MAXCOL]; 
    p = (int(*)[MAXCOL])malloc(MAXROW*sizeof(*p)); 
    free(p); //free memory 
    array<int,MAXCOL> *p1 = new array<int,MAXCOL>[MAXROW]; 
    delete []p1; //use this to delete the variable 
    array<array<int,MAXCOL>,MAXROW> *p2 = new array<array<int,MAXCOL>,MAXROW>; 
    delete p2; // normal delete for this one 
    auto p3 = make_unique<array<array<int,MAXCOL>,MAXROW>>(); 
    //no delete needed for p3, it is a smart pointer. 
}