問題内容
OleTypes.hのVariantの引数付きのコンストラクタで、メンバ変数を初期化することなくVariantCopyIndを実行しています。
Variantのoperator=で、コピー先の変数を解放することなく上書きするのでメモリリークします。
誤:
Variant(Variant &Source) { ::VariantCopyInd(&Data, &Source.Data); }
Variant(VARIANT &Source) { ::VariantCopyInd(&Data, &Source); }
Variant& operator = (Variant& Source) { ::VariantCopyInd(&Data, &Source.Data); return *this; }
正:
Variant(Variant &Source) { ::VariantInit(&Data); ::VariantCopyInd(&Data, &Source.Data); }
Variant(VARIANT &Source) { ::VariantInit(&Data); ::VariantCopyInd(&Data, &Source); }
Variant& operator = (Variant& Source) {
VARIANT tmp;
::VariantInit(&tmp);
::VariantCopyInd(&tmp, &Source.Data);
::VariantClear(&Data);
Data = tmp;
::VariantInit(&tmp);
return *this;
}
再現手順
再現頻度
問題のカテゴリ
環境情報
git masterブランチ
スクリーンショット
問題内容
OleTypes.hのVariantの引数付きのコンストラクタで、メンバ変数を初期化することなくVariantCopyIndを実行しています。
Variantのoperator=で、コピー先の変数を解放することなく上書きするのでメモリリークします。
誤:
Variant(Variant &Source) { ::VariantCopyInd(&Data, &Source.Data); }
Variant(VARIANT &Source) { ::VariantCopyInd(&Data, &Source); }
Variant& operator = (Variant& Source) { ::VariantCopyInd(&Data, &Source.Data); return *this; }
正:
Variant(Variant &Source) { ::VariantInit(&Data); ::VariantCopyInd(&Data, &Source.Data); }
Variant(VARIANT &Source) { ::VariantInit(&Data); ::VariantCopyInd(&Data, &Source); }
Variant& operator = (Variant& Source) {
VARIANT tmp;
::VariantInit(&tmp);
::VariantCopyInd(&tmp, &Source.Data);
::VariantClear(&Data);
Data = tmp;
::VariantInit(&tmp);
return *this;
}
再現手順
再現頻度
問題のカテゴリ
環境情報
git masterブランチ
スクリーンショット