当前位置: 首页 > 知识库问答 >
问题:

移动持有unique_ptr的类实例

苍兴怀
2023-03-14

我有一个类实例的向量。这些实例中的每一个都有一个指向另一个类的unique_ptr。由于我从来不尝试复制类实例,甚至不尝试共享指针,所以我觉得unique_ptr比shared_ptrs更合适,因为指针不是共享的,而是只能通过类实例访问。

这是不好的练习吗?为什么这行不通?我知道将一个实例复制到一个唯一的指针将是错误的,但是既然我移动了它,我不明白为什么不允许这样做?

我必须创建一个自定义移动构造函数吗?而它又该做些什么呢?

唯一的ptr应该在对象实例从向量中移除后立即删除,因为没有引用左,对吗?

用于更好理解的代码示例:

class A {
private:
    int number;

public:
    void f() {
        std::cout << "The number is: " << number;
    }
    A(int i) : number{i} {}
    ~A() = default;
};

class B {
    std::unique_ptr<A> good_a;

    B() : good_a{ std::make_unique<A>(1) } {}
    ~B() = default;
};

int main()
{
    std::vector<B> all;

    B my_b(123);

    all.emplace_back(std::move(my_b));

}

共有2个答案

李招
2023-03-14

如果您需要一个唯一的指针,那么就使用一个唯一的指针。如果这使得包含unique_ptr的类移动--那就这样吧。

这里没有什么是不好的练习。

齐献
2023-03-14

这个答案关注的是您似乎存在的编译错误。好的或坏的练习都留给别人来插话。

您的代码在那里有几个错误,但主要的一个似乎是您的自定义b()构造函数禁止默认的move构造函数。如果添加它,您的代码将变得格式良好。

以下是完整的工作代码供参考:

#include <memory>
#include <vector>

class A {
private:
    int number;

public:
    void f();
    A(int i) : number{i} {}
    ~A() = default;
};

struct B {
    std::unique_ptr<A> good_a;

    B(int k) : good_a{ std::make_unique<A>(k) } {}

    B(B&& ) = default;
    B& operator=(B&& ) = default; // not needed for the example, but good for completeness
};

int main()
{
    std::vector<B> all;
    B my_b(123);
    all.emplace_back(std::move(my_b));
}
 类似资料:
  • 我正在使用STD::UNIQUE_PTR在类上创建一些公共成员,这些成员必须是不可复制或可移动的。但是STD::UNIQUE_PTR是可移动的,我想知道如果有人移动STD::UNIQUE_PTR包含的指针,然后我尝试访问被移动的那个类的STD::UNIQUE_PTR成员,会发生什么。 我所需要的就是使std::unique_ptr不可移动,并简单地保存一个唯一的指针,该指针不能从拥有它的类中移动或

  • 为啥unique_ptr的移动比shared_ptr赋值要慢? 在Modern Effective C++中,提倡使用unique_ptr代替裸指针,因为unique_ptr的大小和性能与裸指针基本一致但更安全,而shared_ptr由于由原子变量的存在性能更差,但是同步赋值试下来,unique_ptr的移动很慢。 运行结果:

  • unique_ptr(定义在中)提供了一种严格的语义上的所有权 拥有它所指向的对象 无法进行复制构造,也无法进行复制赋值操作(译注:也就是对其无法进行复制,我们无法得到指向同一个对象的两个unique_ptr),但是可以进行移动构造和移动赋值操作 保存指向某个对象的指针,当它本身被删除释放的时候(例如,离开某个作用域),会使用给定的删除器(deleter)删除释放它指向的对象, unique_pt

  • 豆子工厂的文件里说 由包含许多bean定义的对象实现 如果BeanFactory或ApplicationContext(也是BeanFactory)持有bean定义,那么哪个类负责持有实际的bean? 据说豆子工厂也是 用于访问Spring bean容器的根接口 这个容器是什么类?

  • 把一个类移动到不同的包下 可以直接把类托动到目标地址 操作步骤: 菜单栏: Refactor —> Move... 快捷键 Mac: fn + F6 (可能会跟系统快捷键冲突)

  • 本文向大家介绍jquery animate动画持续运动的实例,包括了jquery animate动画持续运动的实例的使用技巧和注意事项,需要的朋友参考一下 如下所示: 如上,想要实现左右持续运动,则把该动画封装为一个函数,再反复调用就好。 以上这篇jquery animate动画持续运动的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。