2

次のコードはヒープを使用します。

char* getResult(int length) {
    char* result = new char[length];
    // Fill result...
    return result;
}

int main(void) {
    char* result = getResult(100);
    // Do something...
    delete result;
}

そのresultため、できれば所有者がどこかで削除する必要があります。

以下のコードは、私が理解していることから、VLA と呼ばれる拡張機能を使用しています。これは C99 の一部であり、C++ 標準の一部ではありません (ただし、GCC やその他のコンパイラでサポートされています)。

char* getResult(int length) {
    char result[length];
    // Fill result...
    return result;
}

int main(void) {
    char* result = getResult(100);
    // Do something...
}

resultこの場合、まだスタックに割り当てられていると仮定するのは正しいですか?

コピーですかresult、それともガベージ メモリへの参照ですか? 上記のコードは安全ですか?

4

3 に答える 3

1

から戻るgetResult()と、char 配列resultはスコープ外になり、関数呼び出しのスタック フレームと共に割り当て解除されます。関数構造を保持したい場合は、呼び出しmallocて後でメモリを解放する必要があります。

于 2013-09-12T18:03:16.777 に答える