【问题标题】:If I define a pointer pointing to a smart pointer, does this eliminate the advantages of smart pointer?如果我定义一个指向智能指针的指针,这是否消除了智能指针的优点?
【发布时间】:2015-02-03 01:06:39
【问题描述】:

C++ 智能指针:如果在一个类中,我定义了一个指向智能指针的指针,这是否消除了智能指针的优点? (注意,我没有说我要应用这种用法)

喜欢:

class TestClass
{
    public SmartPt* ptr1;
}

这里的SmartPt是智能指针类。

因为如果我管理不好指针,指向的智能指针也不会被管理。

那么这是否意味着使用指向智能指针的指针不是一个好习惯? 所以最好直接使用智能指针,比如:

public SmartPt object1;

[更新 1] 为了不分散读者的注意力,我之前使用的是 MySmartPt,这里我将其替换为 SmartPt。

【问题讨论】:

  • 你能贴出如何“定义指向智能指针的指针”的代码吗?
  • 在某些极端情况下,您可能需要此类指向智能指针的指针,但我很难考虑实际的应用程序。您能否向我们展示一些您认为使用此类指针有用的代码?
  • @5gon12eder,不,我不是特别想使用它。我只是看到代码,我想我可以修改它。
  • 我不明白你为什么需要创建一个新的智能指针类。
  • @Eric。好的,这是一个包装好的。离题。在此示例中,我们只能使用常规智能指针作为示例。我只是想确认我们不需要使用指向智能指针的指针。

标签: c++ smart-pointers pointer-to-pointer


【解决方案1】:

不,您不应尝试使用指向智能指针的指针,就像您共享的示例中那样。

C++ 中的智能指针是围绕 RAII 原则构建的,这些原则试图尽可能地摆脱 * 运算符。他们还使用原始指针无法理解的复制/赋值重载。

【讨论】:

    【解决方案2】:

    所以如果你的意思是做这样的事情:

    void * vptr;
    int i = 1346;
    
    std::shared_ptr<int> sptr = std::make_shared<int>(i);
    
    vptr = &sptr;
    

    然后共享指针一旦超出范围就会自行删除,因为这就是它应该做的事情。智能指针不保留对它们的指针的引用,只保留对其数据的智能指针的引用。

    另外,如果您致电delete vptr;,将会发生以下两种情况之一:

    1. 智能指针会因为它调用了 delete 而变得非常疯狂。
    2. 如果智能指针超出范围,则 vptr 指向无效的内存块。

    【讨论】:

      猜你喜欢
      • 2016-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-29
      • 1970-01-01
      • 2015-01-24
      • 2014-03-04
      • 1970-01-01
      相关资源
      最近更新 更多