[英]Memory leak after deleting pointer
我有一個 memory 泄漏,我不知道為什么會發生。 請注意,我刪除了大部分與問題無關的代碼,並且大部分都在作業中給出,所以我只寫了Tetrahedron
和add_triangles(...)
function:
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];
}
}
};
由於某種原因,當我不將四面體存儲在單獨的向量中而只是在對象的析構函數中刪除它們時,就會發生 memory 泄漏:
~Object() { delete geometry; }
如果它應該與在add_triangles(...)
function 中編寫的 for 循環中刪除它們相同,它為什么會泄漏? - 我使用VS2019編譯它。
糾正自己:
Tetrahedron 繼承自 Geometry,您正在從指向 Geometry object 的指針中刪除。 沒有調用 Tetrahedron 的析構函數,因為您沒有將 Geometry 的析構函數定義為虛擬的。
在 Geometry 中添加一個虛擬析構函數以允許在這種情況下調用 Tetrahedron 的析構函數。
class Geometry {
protected:
// ...
public:
virtual ~Geometry() {} // <= Virtual destructor
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.