2016-07-15 3 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

を使用する必要がnew[]場合newは、int(*)[MAXCOL] - 2D配列を減衰させるのと同じ型を返します。 delete[] p;を忘れないでください。

最後の部分はstd::vectorの重要性を引き出します。おそらく、コンパイル時に2番目の次元のサイズを知っていると思われます。したがって、std::vector<std::array<int, MAXCOL>>は、delete[]文を必要とせず、そのサイズ(MAXROW)を知っているという追加ボーナスとともに機能します。可能であれば、これを使用してください。

実際、あなたの例では、両方の次元がコンパイル時にわかります。つまり、std::array<std::array<int, MAXCOL>, MAXROW>もここで動作します。これは通常、動的割り当てよりも好ましい方法です。

コンパイル時にいずれの次元も分かっていない場合は、すべての内部ベクトルが同じサイズであることがわかっているときに、パフォーマンスを向上させるためにベクタのベクタまたは専用の行列クラスが最適です。

1

リテラル質問new演算子を使用して、次のコードを記述する方法

&hellip;あなたが意味すると思う以外の何かを意味します。 C++ newオペレータがユーザ定義さによって交換可能であることを除い

newオペレータは、Cのmallocとほぼ直接的に類似した単純な割り当て関数です。

おそらく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配列のネストされたベクトルの使用は避けます。物事を遅くする要素にアクセスするための複数の回帰があります。 – 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。またstd::unique_ptr あなたがdeleteを使用する必要がnew使用する場合は、free非のallocや空きメモリを使用する必要がありますmallocを使用して使用してお勧めします。

p = new int[MAXROW][MAXCOL]; 

これはフリーストアに2次元配列(MAXCOLによってMAXROW)を割り当てて、といつものように:あなたは、文字通り質問に答えるために、簡単に言えば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. 
} 
関連する問題