我一直在干涉,使用英特尔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;
}
答案 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);
在您的代码中,delete
和new
实际上完全匹配。
此外,此行分配了一个int
,因此您可能不会在内存分析中注意到它:
children = new int(50);