使用 std::shared_ptr 分配 class 成员
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;
}
您正在分配给 char*
成员,所以我很确定 shared_ptr
会在分配完成后立即清理(因为它没有存储到另一个 shared_ptr
将保持引用计数)。
如果你想使用shared_ptr
s,你必须始终如一地使用它们;原始指针 class 成员不能为你管理任何东西。指针仍被初始化为分配内存的位置,但不再分配;即使在构造函数后面的一行访问它也将是未定义的behavior/a use-after-free bug。
无论如何,不安全 because default shared_ptr
uses delete
, not delete[]
. 有什么原因不能使用 std::shared_ptr<std::array<char, 100>>
吗?
不,不正确。 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()
退出时被销毁。
我的假设是,在以下示例中,一旦 A
的实例在 func()
结束时超出范围,b
引用的内存将被释放,对吗?
class A{
public:
A() {
b = std::shared_ptr<char>(new char[100] { 0 } );
}
char* b;
}
void func {
A a;
}
您正在分配给 char*
成员,所以我很确定 shared_ptr
会在分配完成后立即清理(因为它没有存储到另一个 shared_ptr
将保持引用计数)。
如果你想使用shared_ptr
s,你必须始终如一地使用它们;原始指针 class 成员不能为你管理任何东西。指针仍被初始化为分配内存的位置,但不再分配;即使在构造函数后面的一行访问它也将是未定义的behavior/a use-after-free bug。
无论如何,不安全 because default shared_ptr
uses delete
, not delete[]
. 有什么原因不能使用 std::shared_ptr<std::array<char, 100>>
吗?
不,不正确。 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()
退出时被销毁。