跳转到内容

拥有对象的所有权却不指向该对象的`shared_ptr`

这种机制称为别名(alias)

例子1

看这个例子:

#include <memory>
#include <iostream>
int main() {
auto One{std::make_shared<int>(1)};
int Two{2};
std::shared_ptr<int> Alias {One, &Two};
std::cout << "Number Pointed At: " << *Alias << std::endl;
return 0;
}

AliasOne拥有对同一个对象的所有权,但是Alias却不指向该对象(这里是1),而指向另一个对象(这里是2)。

注,上面所说的“对象”是抽象的对象,不是指C++里的类对象。“对象”可以指代一个人、物品、概念或事件,通常是在特定情境下讨论或关注的焦点。

例子2

这种机制的一种使用场景是,创建一个共享对象所有权的智能指针,同时将该指针指向该对象的某个成员。

#include <memory>
#include <iostream>
#include <string>
class Character {
public:
explicit Character(std::string name) : m_name{std::move(name)} {}
std::string m_name;
};
int main() {
auto Aoyu {std::make_shared<Character>("Aoyu")};
auto aliasing {std::shared_ptr<std::string>{Aoyu, &Aoyu->m_name}};
std::cout << "Name: " << *aliasing << std::endl;
std::cout << "Owners: " << aliasing.use_count() << std::endl;
return 0;
}

运行结果:

Name: Aoyu
Owners: 2

Aoyualiasing 共享(均拥有)对同一个 Character 实例的所有权,所以引用计数为2

仅当两个 shared_ptrAoyualiasing)都被销毁,Character 实例才会被销毁。

拥有的指针(指向Character的指针)用于引用计数,而储存的指针(指向成员m_name的指针)在对指针进行解引用或调用get()时返回。

参考