0

我有一个结构,它有一个指针作为成员:

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 的想法是错误的?

4

1 回答 1

4

除了将 std::shared_ptr 分配给另一个 std::shared_ptr 实例之外,没有合法的方法可以增加 std::shared_ptr 的所有权计数器。无论如何,它不会解决您的问题。在您的情况下,您必须处理正确的 new/malloc 和 free/delete 已用内存。如果你操作一个 share_ptr,你必须小心你也减少它,否则你会得到你的内存泄漏。这是同样的情况。

  • 如果您可以控制结构 MyStruct,请将其更改为 std::string 或 std::shared_ptr。如果没有,请坚持新/删除恕我直言。它至少是可读和诚实的。
  • 如果您可以控制范围 0 区域,请在此处使用 std::unique_ptr。这是有道理的,因为您不必处理异常。如果您不知道那里需要的大小,请坚持新建/删除。
于 2015-05-20T09:25:35.587 回答