2

私はいくつかのマトリックスクラスを作成していますが、一時オブジェクトがいつ作成されるのか疑問に思っていましたが、それは関数に対してローカルですか? そのため、関数が戻ったときに範囲外になるはずですが、この場合、関数が戻った後に使用できる理由がわかりません。

以下に例を示します。これはコンストラクターです。

int *data;   //member of class
Matrix3(const int (&ar)[N*N])
{
    data = const_cast<int*>(ar);
}

そして、これが私がそれを使用する方法です:

Matrix3 m = { {1,2,3,4,5,6,6,6,6} };

dataこれで、ポインタを介してデストラクタからそのオブジェクトにアクセスできますか? 一時変数はヒープ上に作成されますか?!

4

3 に答える 3

2

一時オブジェクトの有効期間は、関数の最後ではなく、それを導入したステートメントまたは宣言のセミコロンで終了します。(そうしないと、無害なループで簡単にスタック オーバーフローが発生する可能性があります。)

有効期間が終了した後にオブジェクトへの参照を使用すると (ここでは配列など)、未定義の動作が発生します。C++ は、いつ使用されているかを知らせるために、デッド オブジェクトを追跡しません。たまたま、デッド アレイから情報を見つけました。しかし、他の何かがメモリを再利用したり、システムに返されたりしてセグメンテーション違反が発生する可能性があります。

ぶら下がっている参照とポインターを避けます。テストケースで機能する場合でも、フィールドで機能するとは思わないでください。

于 2013-07-31T01:33:41.920 に答える
0

行が実行されると、一時配列が破棄され、データ ポインターが無効になります。

于 2013-07-31T01:27:39.360 に答える
0
int *data; // is a member, so it goes out of scope when the object is destroyed

ただし、次のような関数で宣言した場合:

void someFunction() {

    int *data;


}

// pointer is lost now and is inaccessible 
于 2013-07-31T01:33:04.613 に答える