0

これに潜在的な問題がないことを確認したいだけです。コンパイルして正常に実行されますが、奇妙なメモリ効果のリスクがありますか? この場合、例外について特に注意する必要がありますか?

//...constructor of some class
myobj(int length, int *vars)
{
    // do stuff with vars
}

// inside some other code somewhere
int vars[3] = {5,6,7};
myobj *o = new myobj(3,vars);

(編集)スタック上のオブジェクトへのポインタは常に注意して使用する必要があることを知っているので、私はただ心配しています。私の使用法について具体的に言うと、主に、同じ型の可変数の引数を渡す最速の方法が欲しいです。それで、これは悪い方法ですか?ありがとう..

追記。すべての回答は非常に役に立ちました、ありがとう! この方法を使用するのにパフォーマンスが十分に重要であるかどうか、またはおそらく別の方法で問題を完全に解決できるかどうかを確認します.

4

3 に答える 3

1

呼び出されたコンストラクターで配列をオーバーランしない限り、または関連するメモリを悪用しない限り、これは問題ありません。

const vector<int>&しかし、それは素晴らしいC ++ではありません-パラメータとして使用することの何が問題になっていますか?

myobj特に、スタックベースの配列から作成されたインスタンスに、スタックベースの配列へのポインタを格納しないでください。boost :: shared_arrayintのようなものを使用しない限り、入力値をクラスにコピーする必要があります。

于 2011-07-07T20:20:36.150 に答える
1

myobjなんらかの理由でクラスが へのポインタを格納している場合int[]、あらゆる種類の問題への扉が開かれます。元のvars配列が範囲外になると、ダングリング ポインタが残ります。クラスを簡単にコピーすることはできません。例外の安全性について考える必要があります。などなど

スティーブが提案するように、問題を処理する標準ライブラリ コンテナーを使用することをお勧めします。

質問のタイトルを参照すると、実際に配列を「自由な関数」に渡すだけなら、おそらくこれは許されるかもしれませんが、動的に割り当てられたオブジェクトのコンストラクターでそれを使用していると明示的に言います。それはただのトラブルの匂いです。

于 2011-07-07T20:25:05.180 に答える
1

これには本質的に何も問題はありません。ただし、次の点に注意する必要があります。

  • vars戻った後 (または少なくとも、範囲外になった後) にポインターを保持しないでください。vars宣言されたスコープを離れるまでのみ有効です。
  • vars配列の端からはみ出さないようにしてください。

C++ では、std::vector<int> &パラメーターやその他のコンテナー タイプなどを使用するのがより一般的なスタイルです。これには主に 2 つの理由があります。参照として渡すことで、オブジェクトへのポインターを保持する意図がないことがより明確になります。ベクトルを渡すことで、配列のサイズが配列と共に保持されます。それ自体 (必要に応じて配列を拡張することもできます)。ただし、これはスタイルの問題であり、 へのオーバーヘッドがvectorあるため、パフォーマンスが重視される場合、このアプローチは完全に合理的です。

于 2011-07-07T20:25:52.347 に答える