C++ 为什么这不是内存泄漏?还是这样?删除没有虚拟析构函数的基类指针

C++ 为什么这不是内存泄漏?还是这样?删除没有虚拟析构函数的基类指针,c++,inheritance,memory-leaks,virtual-destructor,C++,Inheritance,Memory Leaks,Virtual Destructor,当我注意到一些不应该发生的事情时,我一直在干预,用英特尔Inspector测试内存泄漏。我从std::vector继承,它不应该有一个虚拟析构函数,我在派生类中有一个额外的成员,我对它进行动态内存分配,主要是在堆上创建一个派生类,转换为基类,调用delete。。。并且没有检测到内存泄漏???按照逻辑,我应该会有内存泄漏 template <typename T> class DynamicArray : public std::vector<T> { public:

当我注意到一些不应该发生的事情时,我一直在干预,用英特尔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;
}
帕雷仍然是DynamicArray类型,将调用右析构函数,这可能会泄漏:

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

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

此表达式没有副作用:

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

特别是与此相关的问题,将析构函数声明为虚拟是一种很好的做法,尽管最重要的是,基本类是真实的。从STL容器编写是不好的,嗯?如果您必须扩展其中一个,请使用合成或非成员非好友模板函数。@AJG85-是的,是的,就像酒精和烟草一样不错,但它并没有阻止人们超越使用和滥用它们。我只打算非常负责任地使用我的派生类,从而对潜在的问题进行广泛的测试。@ddriver因此是south park参考,然而,尽管完全被闪电击中可能很有趣,甚至很有趣,但需要注意的是,最终会伤害到你。同样的事情也适用于带有未定义行为的代码。DynamicArray:childrennullptr{children=new int50;}-为什么?为什么不使用DynamicArray:childrennew int50{}?这是一种未定义的行为,可能比内存泄漏更严重。您是对的,使用新指针,我有一个4字节的泄漏。感谢您的澄清,我每天都会学到一些新的东西。根据标准,通过指向没有虚拟析构函数的基类的指针删除对象是未定义的行为。在第一个备选删除对象中,如果要删除的对象的静态类型不同于其动态类型,静态类型应为要删除对象的动态类型的基类,静态类型应具有虚拟析构函数或行为未定义。5.3.5P3静态转换是多余的,向上转换是一种隐式转换。是的,一个int就足够了,只是为了测试目的
children = new int(50);