1

これが私のコードです:

int *arr1 = new int[size]();
int *arr2 = new int[size]();
int *arr3 = new int[size]();

私は知っています、私は知っています:std::unique_ptrポインタを使用する必要がある場合は使用する必要がありますが、割り当てによって * 配列を使用する必要があります(「動的割り当て」を使用します-使用しますstd::vectorが、何らかの理由で許可されていません)。

私は使用newが悪い習慣であることを知っているので、そのキーワードを使用せずにポインタ配列を使用したり、delete後で行う必要がない方法はありますか?

4

6 に答える 6

4

「古典的な」C++ (最新の最先端標準ではない) に固執する場合、unique_ptr または std::array はなく、new の使用は正常です。ストレージのリーク (削除の失敗による) やストレージの破損 (2 回の削除による) のリスクが伴いますが、これらの問題を回避するようにコーディングするのはあなたの仕事です。

ただし、次のように、メモリ リークが発生しにくい new の使用方法があります。注: これは完全に安全な製品コードではなく、デストラクタを持つクラスを使用して new で割り当てられたストレージの有効期間を管理するチュートリアルの例にすぎません。

class WithAnArray {
     private:
        int *storage;
     public:
        WithAnArray(unsigned size) {
           storage = new int[size];
        }
        ~WithAnArray() {
           delete[] storage;
        }
        int* getArray() {
           return storage;
        }
 }
于 2013-08-31T15:16:35.607 に答える
2

C++11 はstd::arrayを導入しました :-) 問題を回避する方法ですか? :-) :-)

説明は次のとおりです。

std::array は、一定サイズの配列をカプセル化するコンテナーです。

使用例:

std::array<int, 3> a2 = {1, 2, 3};

または、次の例のように std::unique_ptr を使用することもできます。

int size = 10; 
std::unique_ptr<int[]> fact(new int[size]);

for (int i = 0; i < size; ++i) {
    fact[i] = (i == 0) ? 1 : i * fact[i-1];
}

for (int i = 0; i < size; ++i) {
    std::cout << i << ": " << fact[i] << '\n';
}
于 2013-08-31T15:05:15.847 に答える
0

問題はsize、コンパイル時または実行時にのみ既知である (計算できる) かどうかです。

最初の状況が当てはまる場合は を使用し、後者の場合は(間接的に) 使用するか、STL コンテナーに渡されるアロケーター サロゲート (例: )std::arrayを使用しないと方法がありません。newstd::vector

于 2013-08-31T15:09:28.387 に答える