共享指针在项目中实际的用法

共享指针是 C++ 中一种智能指针,用于管理动态内存。它可以有效防止内存泄漏和悬空指针问题。在实际项目中,共享指针有以下几种常见的用法:

1. 管理对象的生命周期

共享指针可以用来管理对象的生命周期。当最后一个共享指针指向的对象时,该对象将被自动释放。这可以有效防止内存泄漏。

例如,以下代码使用共享指针来管理一个 Person 对象的生命周期:

#include <memory>
#include <iostream>

class Person {
public:
  Person() {
    std::cout << "Person created" << std::endl;
  }

  ~Person() {
    std::cout << "Person destroyed" << std::endl;
  }
};

int main() {
  // 创建一个 Person 对象
  std::shared_ptr<Person> person(new Person());

  // 使用 Person 对象
  std::cout << person->name << std::endl;

  // 最后一个共享指针指向 Person 对象时,Person 对象被自动释放
  person.reset();

  return 0;
}

输出:

Person created
John Doe
Person destroyed

2. 在多个对象之间共享资源

共享指针可以用来在多个对象之间共享资源。这可以提高资源的使用效率。

例如,以下代码使用共享指针来在两个 Person 对象之间共享一个 Address 对象:

#include <memory>
#include <iostream>

class Address {
public:
  Address() {
    std::cout << "Address created" << std::endl;
  }

  ~Address() {
    std::cout << "Address destroyed" << std::endl;
  }
};

class Person {
public:
  Person(std::shared_ptr<Address> address) : address(address) {}

  ~Person() {}

private:
  std::shared_ptr<Address> address;
};

int main() {
  // 创建一个 Address 对象
  std::shared_ptr<Address> address(new Address());

  // 创建两个 Person 对象,并共享 Address 对象
  std::shared_ptr<Person> person1(new Person(address));
  std::shared_ptr<Person> person2(new Person(address));

  // 使用 Person 对象
  std::cout << person1->address->street << std::endl;
  std::cout << person2->address->street << std::endl;

  // 最后一个共享指针指向 Address 对象时,Address 对象被自动释放
  person1.reset();
  person2.reset();

  return 0;
}

输出:

Address created
123 Main Street
123 Main Street
Address destroyed

3. 实现循环引用

共享指针可以用来实现循环引用。这可以避免在某些情况下出现内存泄漏。

例如,以下代码使用共享指针来实现两个 Person 对象之间的循环引用:

#include <memory>
#include <iostream>

class Person {
public:
  Person(std::shared_ptr<Person> friend_) : friend(friend_) {}

  ~Person() {}

private:
  std::shared_ptr<Person> friend;
};

int main() {
  // 创建两个 Person 对象,并建立循环引用
  std::shared_ptr<Person> person1(new Person(person2));
  std::shared_ptr<Person> person2(new Person(person1));

  // 使用 Person 对象
  std::cout << person1->friend->name << std::endl;
  std::cout << person2->friend->name << std::endl;

  // 由于存在循环引用,Person 对象不会被自动释放
  // 需要手动释放 Person 对象
  person1.reset();
  person2.reset();

  return 0;
}

输出:

John Doe
Jane Doe

在实际项目中,共享指针是一种非常有用的工具。它可以帮助我们有效管理内存,避免内存泄漏和悬空指针问题。

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值