微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

智能指针是否有实际用例? 1当您无法坚持使用堆栈时 2需要引用几个可能的子类之一 3复杂的解除分配逻辑 4如果无法保证将来的可用性

如何解决智能指针是否有实际用例? 1当您无法坚持使用堆栈时 2需要引用几个可能的子类之一 3复杂的解除分配逻辑 4如果无法保证将来的可用性

我正在阅读有关C ++中的智能指针的信息,但令我惊讶的是,超过99%的示例实际上是非常糟糕的示例,因为在那种情况下可以避免动态分配。我同意仅在STL容器不起作用的情况下使用智能指针。例如,在动态数组(std::vector)中,性能至关重要,因此最好是在没有任何智能指针的情况下使用经过良好测试的代码

我认为这是一个不好的例子,因为在这种情况下unique_ptr不是解决方案,但是堆栈分配是正确的方法

MyObject* ptr = new MyObject(); 
ptr->DoSomething(); 
delete ptr; 

那么C ++中的智能指针有什么好的例子或用?

以不同的方式表示将指针的所有权转移到另一个对象所需的设计模式?

解决方法

令我惊讶的是,超过99%的示例实际上都是非常糟糕的示例,因为在这种情况下可以避免动态分配

这可能是因为这些示例旨在变得非常简单。

那么C ++中的智能指针有什么好的例子或用?

不要介意“善良”,但请考虑以下与它们相关的情况的示例:

1。当您无法坚持使用堆栈时

template <typename T>
std::unique_ptr<T[]> print_and_allocate(std::size_t n)
{
    std::cout << "Allocating " << n << " elements of size " << sizeof(T) << '\n';
    return std::make_unique<T[]>(n);
}

您不能在堆栈上执行分配,因为您将在使用分配的元素之前返回。另外,您不能只返回一个构造的或std::array,因为要分配的元素数事先未知。

2。需要引用几个可能的子类之一

class A;
class B : public A { /* ... */ };
class C : public A { /* ... */ };

// ...

auto my_a = std::unique_ptr<A>(condition ? (A*) new B : (A*) new C);
my_a.some_virtual_method();

3。复杂的解除分配逻辑

指针不会告诉您何时/如何释放/释放它。您可以做一个简单的假设(“我需要释放从此函数获得的指针”),但这已经建议在包装类中表达您的假设。如果取消分配的条件更加复杂,特别是如果指针接收者不了解它们,那么以某种方式进行通信就变得至关重要。 std::shared_ptrstd::weak_ptr是这样做的两种方法。另一个是带有custom deleterstd::unique_ptr

4。如果无法保证将来的可用性

当指针的提供者不能保证它会继续有效时,但希望它可能是有效的-您需要某种包装器类来反映该事实并确保您不尝试取消引用。指针,实际上却不能。这就是std::weak_ptr()发挥作用的地方。


更一般的说:如果由于某种原因,您需要在之前分配内存并持有一个指针,并且没有它就无法做-您最有可能希望改用智能指针。另请参阅:

What is a smart pointer and when should I use one (answer)

,

那么C ++中的智能指针有什么好的例子或用?

任何需要在堆上使用资源的情况。

您是正确的,在现实世界中,大多数智能指针示例都将使用堆栈分配来编写。但这仅仅是-用于演示智能指针的使用/优点的简单示例。

但是,实际上,您不能将所有内容都放在堆栈上。并且一旦需要在堆上动态分配内存,智能指针几乎总是比带有new / delete的原始指针更好的选择。

,

在实际使用案例中,您实际上不想关心内存管理。您不希望内存泄漏,因为您忘记了某个地方的delete。那就是智能指针派上用场的地方,因为它们解除了清理您的责任。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。