使用 std::shared_ptr 分配类成员



我的假设是,在以下示例中,一旦A实例在func()结束时超出范围,b引用的内存将被释放,对吗?

class A{
public:
   A() {
        b = std::shared_ptr<char>(new char[100] { 0 } );
   }
   char* b;
}
void func {
   A a;
}

不,不正确。 b 属于 char * 类型,您可以为其分配一个shared_ptr<char> 。您应该会收到编译错误。

此外,构造函数private,另一个编译错误。

您如何在func()中访问b?它在A是私人的。

显然你的练习是不完整的...所以我只是从你提供的内容出发。

此外,我建议使用unique_ptr以防您可以说它是一个独特的所有权(在我看来

似乎是这样(。

这将编译:

#include <memory>
#include <iostream>
class A {
public:
    A() {
        std::cout << "A created with unique pointer" << std::endl;
        b = std::unique_ptr<char>(new char[100] {
            0
        });
    }
    ~A() {
        std::cout << "A destroyed" << std::endl;
    }
private:
    std::unique_ptr<char> b;
};
void func() {
    A a;
}
int main() {
    std::cout << "Call func()" << std::endl;
    func();
    std::cout << "func() called" << std::endl;
    return 0;
}

最后func() A被摧毁,随之而来的是unique_ptr.

但是,问问自己是否真的需要使用指针?在您的情况下,自动变量应该没问题;它做同样的事情(即当func()退出时被摧毁。

您正在分配给char*成员,因此我很确定shared_ptr在分配完成后立即清理(因为它没有存储到另一个将保持引用计数的shared_ptr(。

如果要使用 shared_ptr,则必须一致地使用它们;原始指针类成员无法为您管理任何内容。指针仍初始化到分配内存的位置,但不再分配;即使在构造函数后面访问一行也将是未定义的行为/释放后使用的错误。

无论如何,不安全,因为默认shared_ptr使用delete,而不是delete[]。有什么原因不能使用std::shared_ptr<std::array<char, 100>>吗?

相关内容

  • 没有找到相关文章

最新更新