删除指针后内存泄漏
Memory leak after deleting pointer
我有内存泄漏,我不知道为什么会发生。请注意,我删除了大部分与问题无关的代码,其中大部分是在作业中给出的,所以我只写了Tetrahedron
和add_triangles(...)
函数:
class Geometry {
protected:
unsigned int vao, vbo;
public:
/* Generates 1 vertex buffer */
};
class Tetrahedron : public Geometry {
std::vector<VertexData> vtxData;
vec3 points[4];
public:
Tetrahedron() : points { /* default points */ } { create(); }
Tetrahedron(const vec3 p0, const vec3 p1, const vec3 p2, const vec3 p3) : points { p0, p1, p2, p3 } { create(); }
void create() {
/* Creates the 4 sides ans stores at vtxData */
/* Passing the data to OpenGL */
}
void gen(std::vector<Tetrahedron*>& data, int stop_at = 0, float tend = 1, int depth = 0) {
data.push_back(this);
if (depth > stop_at) {
return;
}
for (int i = 0; i < 4; i++) {
/* calculate new points */
(new Tetrahedron{ /* new points */ })->gen(data, stop_at, tend, depth + 1);
}
}
};
struct Object {
Geometry* geometry;
public:
/* Drawns and rotates the given geometry */
};
class Scene {
std::vector<Object*> objects;
std::vector<Tetrahedron*> thets;
public:
void Build() {
/* Setting up shaders, lights, materials, objects */
add_triangles();
}
void add_triangles(float tend = 1) {
for (unsigned int i = 0; i < objects.size(); i++) {
delete objects[i];
} std::vector<Object*>{}.swap(objects);
for (unsigned int i = 0; i < thets.size(); i++) {
delete thets[i];
} std::vector<Tetrahedron*>{}.swap(thets);
(new Tetrahedron{})->gen(thets, 1, tend);
for (unsigned int i = 0; i < thets.size(); i++) {
objects.push_back(new Object{ thets[i] });
}
}
void Animate(float tstart, float tend) {
/* ... */
add_triangles(fabs(cosf(tend) * sinf(tend)) + 1);
/* ... */
}
~Scene() {
for (unsigned int i = 0; i < objects.size(); i++) {
delete objects[i];
}
for (unsigned int i = 0; i < thets.size(); i++) {
delete thets[i];
}
}
};
由于某种原因,当我不将四面体存储在单独的向量中而只是在对象的析构函数中删除它们时,就会发生内存泄漏:
~Object() { delete geometry; }
如果它应该与在add_triangles(...)
函数中编写的 for 循环中删除它们相同,为什么它会泄漏? - 我使用 VS2019 编译它。
纠正自己:
- 事实上,这段代码不会泄漏,它会单独删除四面体。
- 如果我希望对象删除其四面体"几何体",它会泄漏。
四面体继承自几何体,您正在从指向几何对象的指针中删除。 未调用四面体的析构函数,因为您未将几何体的析构函数定义为虚拟。
将虚拟析构函数添加到几何体,以允许在这种情况下调用四面体的析构函数。
class Geometry {
protected:
// ...
public:
virtual ~Geometry() {} // <= Virtual destructor
};
相关文章:
- C++功能泄漏内存,我是C++新手,不确定如何解决
- 我的堆栈弹出式磁带的实现是否泄漏内存?
- 将 c++ 向量转换为字符 ** 而不会泄漏内存
- 析构函数 C++ 使泄漏内存
- 构造函数对象赋值是否泄漏内存
- corba :: orb_init泄漏内存
- Gmock泄漏内存
- 如何在不泄漏内存的情况下删除链接列表
- Visual C ODBC关闭记录集泄漏内存
- 为什么泄漏内存比在动态数组上执行 delete[] 慢
- OpenGL正在泄漏内存.哪个对象未释放
- 可以std ::退出泄漏内存
- uiautomation findall泄漏内存
- 为什么在此OpenCL代码中泄漏内存,为什么要泄漏内存
- pthread在完成后会泄漏内存
- win32 标准::线程泄漏内存
- 返回指向同一变量的指针是否会泄漏内存
- 使用clectType(new any_type())可能会泄漏内存泄漏
- Windows开发:如何确定我的应用程序是否正在泄漏内存
- WinHttp打开泄漏内存