閑古鳥

オールドプログラマの日記。プログラミングとか病気(透析)の話とか。

C++でメモリがコピーされるのかされないのか、意識せずにハマることがある

たとえば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++難しいです。マニュアルをちゃんと読みなさいという話ではあります。