0

double配列へのポインターのベクトルを作成します。これらのポインタは、関数(つまりInsertIntoVector)の終了後に有効ですか?後でのようにポインタをフェッチした場合GetVecElementでも、ポインタは割り当てられたのと同じメモリ位置を指すことが保証されていますか?

class A { 
   vector<double*> vec; 

   void insertIntoVector(double x, double y); 
   void GetVecElement(int i, double& x, double& y); 
}; 

A::insertIntoVector(double x, double y) { 
   double* xy = new double[2]; 
   xy[0] = x; xy[1] = y; 
   vec.push_back(xy);       
}

A::GetVecElement(int i, double& x, double& y)
{
    x = vec[i][0];       // will the reference to the double array still be valid? 
    y = vec[i][1];
}
4

2 に答える 2

2

それらは参照ではありません!それらはポインタです...

後でGetVecElementのようにポインタをフェッチした場合でも、参照は割り当てられたのと同じメモリ位置を指すことが保証されていますか?

あなたはポインタを削除しておらずstd::vector、あなたのためにそれを行わないので、はい、ポインタは有効なままです。のデストラクタでそれぞれを手動で実行しない限り、リークも発生します。ただし、そのためには、の内容を複製するために、コピーコンストラクター割り当て演算子も必要になります。deleteAvector

于 2012-06-08T23:56:51.337 に答える
0

GetVecElement関数を使用して参照引数を介して取得する値は、ベクトルの要素(insertIntoVector()で割り当てたもの)が指すスタック上の配列の値です。コード内のどこでもこれらを削除していないため(または少なくとも表示どおり)これらの値は引き続き保持されますが、このメモリをクリーンアップする追加のコードがなく、例でアップロードしていない場合を除いて、基本的にここにあるのはメモリリークです。ベクトルが削除された場合、またはクリアすると、ベクトルのdouble *要素であると指摘されたメモリ位置は、クリーンアップするコードをアクティブに実装しない限り存続します(これは良い考えです)。

于 2012-06-09T00:08:41.470 に答える