为什么这不是内存泄漏?或者是吗?删除没有虚拟析构函数的基类指针

时间:2012-04-27 17:01:43

标签: c++ inheritance memory-leaks virtual-destructor

我一直在干涉,使用英特尔Inspector测试内存泄漏,当时我发现了一些不应该的东西。我继承了std :: vector,它不应该有一个虚拟的析构函数,我在派生类中有一个额外的成员,我在它上面做动态内存分配,在main我在堆上创建一个派生类,强制转换为基类,调用删除...并且没有检测到内存泄漏???按照所有逻辑,我应该得到内存泄漏。

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;
}

2 个答案:

答案 0 :(得分:7)

pArray仍然是DynamicArray<int>类型,并且会调用正确的析构函数,这可能会泄漏:

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

编辑:正如Ben Voigt正确提到的那样,这个最后的代码片段实际上是未定义的行为,因为std::vector的析构函数不是虚拟的。所以它甚至不能保证会泄漏

答案 1 :(得分:5)

此表达式没有副作用:

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

在您的代码中,deletenew实际上完全匹配。


此外,此行分配了一个int,因此您可能不会在内存分析中注意到它:

children = new int(50);