たとえばOpenCVで以下のようなコードを書くと落ちるのは、分かるんですが、分からないときがある。
cv::Mat GetImage() { std::vector<uint8_t> buf = ...; return cv::Mat(128, 128, CV_8U, buf.data()); } const auto mat = GetImage(); cv::mean(mat); // 死
このくらい近ければぱっと見でも分かるのですが、実行時エラーになるので距離があると悩んでしまったり。cv::Matのこのコンストラクタは渡されたバッファをコピーしないので、関数を抜けると参照先(buf変数)が解放されてしまうというやつ。
機械学習ライブラリとかでもデータ渡してテンソルを作るぞ!みたいなクラスで同じ事をやって、計算中に落ちてあれーってなったり。
毎回コピーするような実装だとパフォーマンスも気になってしまうのでそれはそれで…ということで、C++難しいです。マニュアルをちゃんと読みなさいという話ではあります。