我的假设是,在下面的示例中,b
引用的内存将在A
结束后超出范围时被解除分配,是吗?
func()
答案 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>>
无法使用?