次のコードスニペットでは簡単なエラーはありませんが、私はAddressSanitizerのようなツールでそれをキャッチすることが予想されます。 std :: vectorの手動中毒
#include <vector>
#include <iostream>
int main()
{
std::vector<int> toto;
toto.push_back(2);
int const& titi = toto[0];
toto.pop_back();
std::cout << titi << std::endl;
return 1;
}
範囲外エラーが利用ヒープ後にフリースローされたキャッチ参照ベクトルと印刷をscopping
。スコープが存在しない場合、std :: vector実装はおそらくpop_backの後にメモリを解放しないため、参照はまだ有効なのメモリを指しています。
私の周りの検索持っていると私は、これはSTLライブラリで実装されている場合は、私は手動で毒メモリを思っていたことが判明。これは、クランのlibcの++とのlibstdc Googleの支店++(に実装されている(https://github.com/google/sanitizers/wiki/AddressSanitizerManualPoisoning)
おそらく、ランタイムライブラリの1つがデバッグビルドでこれを行います。しかし、私は、あなたが必要とするものだけを支払うという原則に反しているので、リリースビルドでこれを期待しません。 –