gpt4 book ai didi

c++ - 适当破坏某些类(class)成员

转载 作者:行者123 更新时间:2023-11-30 01:54:48 25 4
gpt4 key购买 nike

我有一个包含多个可以重新分配的指针成员的类。当我使用 LoadOBJ() 函数时,我应该替换已经保存的数据,但我在垃圾回收方面遇到了麻烦。下面是一些代码。

class Object3d{

public:

int nVertex;
int nFace;
int nVertexNormal;

Vector3d *vertex;
Vector3d *vertexNormal;
Face3d *face;

void LoadOBJ(char*);
Object3d():nVertex(0), nFace(0), vertex(NULL), face(NULL){}
Object3d(char*);
~Object3d(){}
};

Face3d:

struct Face3d{
int nFaceV;
int *iVertex;
int *iVertexNormal;

Face3d():nFaceV(0){}
};

每次我用 LoadOBJ() 函数加载一个新对象时,我都想删除以前分配的内存,而不是只使用 new 并泄漏以前分配的内存。

我不知道该怎么做。这是我现在想到的:

void *vGarbage, *vGarbage2, 
*fGarbage,
*iGarbage, *iGarbage2;

//nFace is the previous number of faces; in the case of a new object, it's 0
for(int i=0; i<nFace; i++)
{
iGarbage=face[i].iVertex;
iGarbage2=face[i].iVertexNormal;
delete[] iGarbage;
delete[] iGarbage2;
}

vGarbage=vertex;
fGarbage=face;
vGarbage2=vertexNormal;

delete[] vGarbage;
delete[] vGarbage2;
delete[] fGarbage;

每次我使用 LoadOBJ() 时,上面的代码都会运行,但仍然存在内存泄漏。我还想知道这样做是否正确?

澄清问题所在:为什么我仍然有内存泄漏?而且,有没有更好/更干净的方法来删除以前分配的内存?

最佳答案

查看 C++11 的 smart_pointers ,它们提供了分配内存的能力,当对象超出范围时,内存将被自动释放。

#include <memory>
#include <iostream>

struct Foo {
Foo() { std::cout << "Foo...\n"; }
~Foo() { std::cout << "~Foo...\n"; }
};

struct D {
void operator()(Foo* p) const {
std::cout << "Call delete for Foo object...\n";
delete p;
}
};

int main()
{
{
std::cout << "constructor with no managed object\n";
std::shared_ptr<Foo> sh1;
}

{
std::cout << "constructor with object\n";
std::shared_ptr<Foo> sh2(new Foo);
std::shared_ptr<Foo> sh3(sh2);
std::cout << sh2.use_count() << '\n';
std::cout << sh3.use_count() << '\n';
}

{
std::cout << "constructor with object and deleter\n";
std::shared_ptr<Foo> sh4(new Foo, D());
}
}

输出:

constructor with no managed object constructor with object Foo... 2 2 ~Foo... constructor with object and deleter Foo... Call delete for Foo object... ~Foo...

( http://en.cppreference.com/w/cpp/memory/shared_ptr/shared_ptr )

请记住,对于每个 new,释放内存时都应调用 delete。如果局部指针被破坏并且您在此之前没有释放内存,则它们可能很危险。

RAII paradigm面向对象的 C++ 专门设计用于简化资源管理(以及内存管理)。

如果灾难已经发生,你可以用 http://deleaker.com/ 之类的东西清理你的代码或等效的内存泄漏查找器软件。

此外:如果您不会使用 C++11 或您不会使用支持 C++11 的编译器,请尝试自己实现智能指针,这应该不会太难,并且肯定会有所帮助你的内存力问题。

关于c++ - 适当破坏某些类(class)成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21571682/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com