【问题标题】:Giving up ownership of a memory without releasing it by shared_ptr放弃内存的所有权而不通过 shared_ptr 释放它
【发布时间】:2015-06-25 10:31:31
【问题描述】:

有没有办法让共享指针指向不同的内存位置,而无需释放当前所指向的内存

请考虑代码:

#include <boost/shared_ptr.hpp>
#include <boost/make_shared.hpp>
#include <iostream>

int
main()
{
    int *p = new int();
    *p = 10;
    int *q = new int();
    *q = 20;

    boost::shared_ptr<int> ps(p);

    // This leads to a compiler error
    ps = boost::make_shared<int>(q);

    std::cout << *p << std::endl;
    std::cout << *q << std::endl;
    return 0;
}

【问题讨论】:

  • 我不明白围绕这个问题的反对票。 C++ 中的智能指针对于普通人来说并不是容易掌握和理解的概念。它不像程序未编译,关键字丢失等。问题很小,只有一段工作代码。提问的人还有什么期望?

标签: boost shared-ptr make-shared


【解决方案1】:

你不能。

当然你可以释放并重新附加,同时将删除器更改为无操作

说实话,看起来你只是想要

ps = boost::make_shared<int>(*q);

打印(live on Coliru):

0
20

【讨论】:

  • 如果我没有明确地释放它,上面的语句就会有 q 的泄漏权?
  • 没有。共享指针将在销毁/重新分配时充分释放其拥有的资源
  • 我在 valgrind 下运行代码。它说在以下位置读取大小为 4 的无效:std::cout
  • @gudge 哦,啊哈,我读错了std::cout 行(顺便说一句,你为什么要这样做?你明确地重新分配ps,所以很明显p 是晃来晃去。我想你在那里做了std::cout &lt;&lt; *psstd::cout &lt;&lt; *qs。因为你从来没有释放过q,那肯定是泄露了。
  • 请告诉我们你想要达到的目标(不是/how/)。所以我们可以给出一个有用的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-07
  • 1970-01-01
  • 2010-09-14
  • 2014-09-12
  • 2012-09-24
  • 2014-06-24
  • 2012-12-10
相关资源
最近更新 更多