c – 删除与其他类共享的指针
我在使用类之间共享的指针在c中进行内存释放时遇到问题.
一个例子: 我的顶点定义为: class Vertex{ double x; double y; } 正方形定义为: class Square{ Square(Vertex* a,Vertex* b,Vertex* c,Vertex* d); ~Square(); // destructor Vertex* a; Vertex* b; Vertex* c; Vertex* d; } 我的析构函数实现如下: Square::~Square(){ delete a; delete b; delete c; delete d; } 我的方块存储在std :: vector< Square *>中.方块,所以为了清理我的所有记忆,我做了: for(unsigned int i = 0; i < squares.size(); i++){ delete(squares.at(i)); } 那么问题是什么?如果两个方格共享一个顶点,我的程序崩溃,因为它试图删除一个不再存在的指针. 解决方法
在我看来,你是用C语言编写的.仅包含两个双精度的顶点对象(例如,在您的情况下为X和Y组件)更好地存储在堆栈上,没有指针间接.所以,我会像这样声明Square类:
class Square{ ... Vertex a; Vertex b; Vertex c; Vertex d; }; 如果不是嵌入Vertex对象而是想要一种引用机制,则可以将顶点存储在std :: vector< Vertex>中.数组,并存储在Square类中的整数索引到数组中的顶点位置. 如果您真的想要使用指针共享所有权语义,那么请考虑使用像std :: shared_ptr这样的智能指针.没有显式删除:当引用计数达到零时,shared_ptr将自动释放内存. 在这种情况下,将原始Vertex *拥有指针数据成员替换为shared_ptr< Vertex>在你的Square类里面.此外,从Square类中删除析构函数代码,因为shared_ptr知道如何删除自身. 在Square类构造函数中,您可以使用shared_ptr< Vertex>按值划分智能指针,std ::将它们移动到相应的数据成员中,例如: Square::Square( std::shared_ptr<Vertex> pa,std::shared_ptr<Vertex> pb,std::shared_ptr<Vertex> pc ) : a{std::move(pa)},b{std::move(pb)},c{std::move(pc)} {} 也替换矢量< Square *> with vector< shared_ptr< Square>> (但是,再一次,你确定一个更简单的向量< Square>不能很好地为你服务吗?),并使用std :: make_shared来创建智能指针. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |