gpt4 book ai didi

c++ - 我应该在类构造函数内部还是外部初始化 shared_ptr ?

转载 作者:太空狗 更新时间:2023-10-29 19:52:18 24 4
gpt4 key购买 nike

给定以下示例代码:

#include <memory>

class Foo {
public:
Foo(std::shared_ptr<int> p);
private:
std::shared_ptr<int> ptr;
};

Foo::Foo(std::shared_ptr<int> p) : ptr(std::move(p)) {
}

class Bar {
public:
Bar(int &p);
private:
std::shared_ptr<int> ptr;
};

Bar::Bar(int &p) : ptr(std::make_shared<int>(p)) {
}

int main() {
Foo foo(std::make_shared<int>(int(256)));
Bar bar(*new int(512));

return 0;
}

Foo 和 Bar 都可以正常工作。但是,在调用构造函数时创建 shared_ptr 然后使用 std::move 转移所有权与仅传递对对象的引用并将 shared_ptr 的创建委托(delegate)给类构造函数之间有什么区别吗?

我认为第二种方法更好,因为我不必移动指针。但是,我在阅读的代码中看到的大多是第一种方式。

我应该使用哪一个,为什么?

最佳答案

Foo 是正确的。

酒吧令人厌恶。它涉及内存泄漏、不安全的异常行为和不必要的复制。

编辑:内存泄漏的解释。

解构这一行:

Bar bar(*new int(512));

这些操作的结果:

  1. 调用 new int(512),这会调用 operator new,返回指向堆上 int 的指针(内存分配)。
  2. 解引用指针以便为 Bar 的构造函数提供常量引用
  3. Bar 然后用 make_shared 返回的值构造它的 shared_ptr(这部分是高效的)。此 shared_ptr 的 int 使用通过引用传递的 int 的拷贝进行初始化。
  4. 然后函数返回,但是由于没有变量记录从new返回的指针,所以没有什么可以释放内存。为了销毁对象并释放其内存,每个新的都必须通过删除进行镜像。
  5. 因此内存泄漏

关于c++ - 我应该在类构造函数内部还是外部初始化 shared_ptr ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27926878/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com