0

当我注意到不应该发生的事情时,我一直在插手,使用 Intel Inspector 测试内存泄漏。我从不应具有虚拟析构函数的 std::vector 继承,派生类中有一个额外的成员,我对其进行动态内存分配,在 main 中我在堆上创建派生类,强制转换为基类,调用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;

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

于 2012-04-27T17:03:05.497 回答
5

这个表达式没有副作用:

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

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


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

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