0

あるべきではないことに気づいたとき、私はIntel Inspectorでメモリリークをテストして、いじくり回してきました。仮想デストラクタを持たないstd::vectorから継承し、派生クラスに追加のメンバーがあり、動的メモリ割り当てを行います。主に、ヒープ上に派生クラスを作成し、基本クラスにキャストします。 、deleteを呼び出します...そしてメモリリークは検出されませんか?すべての論理で、メモリリークが発生するはずです。

template <typename T>
class DynamicArray : public std::vector<T> {
public:    
    DynamicArray() : children(nullptr) {
        children = new int(50);
    }
    ~DynamicArray() {
        if (children) delete children;
    }
    DynamicArray& operator<<(const T& value)
    {
        push_back(value);
        return *this;
    }
private:
    int *children;
};


int main() {
    DynamicArray<int> *pArray = new DynamicArray<int>;
    (*pArray) << 4 << 5;
    static_cast<std::vector<int>*>(pArray);
    delete pArray;
}
4

2 に答える 2

7

pArrayはまだタイプDynamicArray<int>であり、適切なデストラクタを呼び出します。これはリークする可能性があります。

std::vector<int>* wrong = static_cast<std::vector<int>*>(pArray);
delete wrong;

std::vector編集:Ben Voigtが正しく述べたように、のデストラクタは仮想ではないため、この最後のコードスニペットは実際には未定義の動作です。したがって、これがリークすることさえ保証されていません

于 2012-04-27T17:03:05.497 に答える
5

この式には副作用はありません。

static_cast<std::vector<int>*>(pArray);

あなたのコードでは、deletenewは実際には完全に一致しています。


また、この行は ONEintを割り当てているため、メモリ分析では気付かない場合があります。

children = new int(50);
于 2012-04-27T17:04:14.993 に答える