はこれをしないでください。いずれの場合で
void getArray(double* a)
{
std::vector<double> v;
a = &v[0];
} // The vector is destroyed here, and the memory
// is deallocated.
は、あなたがあなたの関数の外
a
ポインタを変更していない、あなたは所望の効果を得ることはありませんので。
代わりにvector
を返して、直接使用してください。または、一般的に、コード全体でベクトルを使用します。配列へのポインタを期待する関数にをに渡す必要がある場合は、そこに&v[0]
を渡すことができます。そのような関数は、通常、サイズも期待しています。これには、v.size()
を渡します。これは、その関数が所有権を取得していないか、メモリの割り当てを解除していない限り、安全に行うことができます。
std::vector<double> v;
と宣言されたベクトルにはサイズがないため、v[0]
のように最初の要素にアクセスしようとすると、未定義の動作になります。少なくとも、ある程度のメモリが確保されるように、ベクトルにサイズを渡す必要があります(コンストラクタにサイズを渡す)。最初の要素のアドレスを取得しようとするときを含めて、ベクトルにインデックスを付ける前に必ずベクトルに割り当てられたメモリがあることを確認する必要があります。あなたはおそらく何をしたいのか
は次のとおりです。
std::vector<double> getArray() {
std::vector<double> v = /* some sane initialisation */;
return v;
}
// some time later, assuming a function:
// void do_something(double* a, size_t n);
// ...
std::vector<double> v = getArray();
if (v.size()) {
do_something(&v[0], v.size());
} else {
// fail gracefully
}
'a'はゴミを指します。一度' v'がスコープ外であれば、何も削除されません。 – user463035818
あなたがそこに見るように、関数呼び出しは関与していません。 –
@DieterLücking何を意味するのですか?デストラクタは関数ではありませんか? – Basilevs