使用std :: shared_ptr分配类成员

时间:2015-10-30 03:27:53

标签: c++ c++11 shared-ptr smart-pointers

我的假设是,在下面的示例中,b引用的内存将在A结束后超出范围时被解除分配,是吗?

func()

2 个答案:

答案 0 :(得分:3)

不,不正确。 b的类型为char *,您可以为其指定shared_ptr<char>。您应该收到编译错误。

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

您如何访问b中的func()?它在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()退出时被销毁。

答案 1 :(得分:2)

您已分配给char*成员,因此我很确定在作业完成后shared_ptr会立即清除(因为它尚未存储)到保持引用计数的另一个shared_ptr

如果你想使用shared_ptr,你必须始终如一地使用它们;原始指针类成员无法为您管理任何内容。指针仍然初始化为分配内存的位置,但它不再分配;在构造函数中稍后访问它甚至是一行将是未定义的行为/使用后免费的bug。

无论如何,不​​安全because default shared_ptr uses delete, not delete[].是否有某些原因std::shared_ptr<std::array<char, 100>>无法使用?