如何增加 std::shared 指针的所有权计数
How can I increase ownership count of std::shared pointer
我有一个以指针作为成员的结构:
struct MyStruct {
char *ptr;
}
我想在一个范围内初始化 ptr,然后能够在该范围外使用它:
{ // scope 0
{ //scope 1
{ // scope 2
mystruct.ptr = new char[100];
}
// mystruct.ptr still lives here
}
// i dont need mystruct anymore
delete[] mystruct.ptr;
}
但后来我不得不删除它,这很容易出错,我宁愿避免这样做。所以我想使用 std::shared_ptr
.
{ // scope 0
{ //scope 1
{ // scope 2
auto a = std::make_shared<char>(new char[100]);
mystruct.ptr = a.get(); // ??????? HOW TO ASSIGN
}
// mystruct.ptr still SHOULD live here
}
}
那么,我该怎么做呢?我应该如何将 shared_ptr 分配给 mystruct.ptr 以便所有权计数变为 2?我看到 get() 不起作用,因为它只是传递指针而不提供所有权,所以它被删除了。
如您所见,这里的主要动机是延长寿命,所以我对其他做法持开放态度。也许我想在这里使用 shared_ptr 是错误的?
除了将 std::shared_ptr 分配给另一个 std::shared_ptr 实例之外,没有合法的方法来增加它的所有权计数器。它无论如何都不能解决你的问题。在您的情况下,您必须妥善处理已用内存的 new/malloc 和 free/delete。如果你操作一个 share_ptr 你必须小心你也减少它,否则你会发生内存泄漏。这是同样的情况。
- 如果您可以控制 MyStruct 结构,请将其更改为 std::string 或 std::shared_ptr。如果没有,请坚持 new/delete 恕我直言。它至少是可读的和诚实的。
- 如果您可以控制范围 0 区域,请在那里使用 std::unique_ptr。这是有道理的,因为您不必处理异常。如果您不知道那里需要的尺寸,请坚持 new/delete。
我有一个以指针作为成员的结构:
struct MyStruct {
char *ptr;
}
我想在一个范围内初始化 ptr,然后能够在该范围外使用它:
{ // scope 0
{ //scope 1
{ // scope 2
mystruct.ptr = new char[100];
}
// mystruct.ptr still lives here
}
// i dont need mystruct anymore
delete[] mystruct.ptr;
}
但后来我不得不删除它,这很容易出错,我宁愿避免这样做。所以我想使用 std::shared_ptr
.
{ // scope 0
{ //scope 1
{ // scope 2
auto a = std::make_shared<char>(new char[100]);
mystruct.ptr = a.get(); // ??????? HOW TO ASSIGN
}
// mystruct.ptr still SHOULD live here
}
}
那么,我该怎么做呢?我应该如何将 shared_ptr 分配给 mystruct.ptr 以便所有权计数变为 2?我看到 get() 不起作用,因为它只是传递指针而不提供所有权,所以它被删除了。
如您所见,这里的主要动机是延长寿命,所以我对其他做法持开放态度。也许我想在这里使用 shared_ptr 是错误的?
除了将 std::shared_ptr 分配给另一个 std::shared_ptr 实例之外,没有合法的方法来增加它的所有权计数器。它无论如何都不能解决你的问题。在您的情况下,您必须妥善处理已用内存的 new/malloc 和 free/delete。如果你操作一个 share_ptr 你必须小心你也减少它,否则你会发生内存泄漏。这是同样的情况。
- 如果您可以控制 MyStruct 结构,请将其更改为 std::string 或 std::shared_ptr。如果没有,请坚持 new/delete 恕我直言。它至少是可读的和诚实的。
- 如果您可以控制范围 0 区域,请在那里使用 std::unique_ptr。这是有道理的,因为您不必处理异常。如果您不知道那里需要的尺寸,请坚持 new/delete。