[英]Allocating class member with 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
是私有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>>
?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.