加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 删除与其他类共享的指针

发布时间:2020-12-16 10:07:51 所属栏目:百科 来源:网络整理
导读:我在使用类之间共享的指针在c中进行内存释放时遇到问题. 一个例子: 我的顶点定义为: class Vertex{ double x; double y;} 正方形定义为: class Square{ Square(Vertex* a,Vertex* b,Vertex* c,Vertex* d); ~Square(); // destructor Vertex* a; Vertex* b
我在使用类之间共享的指针在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来创建智能指针.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读